薛貓貓杯 成語接龍(紀念第一次一血)
阿新 • • 發佈:2018-12-03
小Z和大Z最近沉迷於成語接龍遊戲,他們準備把成語接龍的規則修改一下。規則是這樣的:有兩個字串,如果第一個字串是第二個字串的子串(也就是第一個字串在第二個字串中可以找到),那麼第一個字串後面可以接第二個字串。問題來了,現在有n個字串,你可以把n個字串的順序進行重組,使得這n個字串可以成語接龍,即第一個字串後面可以接第二個字串,第二個字串後面可以接第三個字串,…,第n-1個字串後面可以跟第n個字串。問你能不能把n個字串順序重組,滿足這n個字串可以成語接龍。
Input
第一行為一個整數T,代表有T組樣例。(T<=10)
每組資料中:
第一行為一個整數N,表示有N個字串。(N<=100)
接下來n行,每行一個字串,每個字串長度小於等於100。
Output
對於每組測試樣例,如果這n個字串順序重排之後可以成語接龍,輸出“Yes”,否則輸出“No”。每個測試樣例佔一行。
Sample Input
3
5
Abcabc
Abc
Abca
Abc
A
2
ABAC
ACB
2
ACDB
ACB
Sample Output
Yes
No
No
7分30秒一血。
暴力就完事了。
這不是重點,重點是我字尾自動機做法都想完了看到了n小於100…
按長度排序然後暴力比較。
ac程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 105;
struct Str {
char s[maxn];
int len;
} str[maxn];
bool cmp(Str &a, Str &b) {
return a.len < b.len;
}
int main() {
int t, n;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%s", str[i].s);
str[i].len = strlen(str[i].s);
}
sort(str, str + n, cmp);
bool flag = 0;
for(int i = 0; i < n - 1; i++) {
if(!strstr(str[i + 1].s, str[i].s)) {
flag = 1;
break;
}
}
printf("%s\n", flag ? "No" : "Yes");
}
return 0;
}