1. 程式人生 > >薛貓貓杯 成語接龍(紀念第一次一血)

薛貓貓杯 成語接龍(紀念第一次一血)

小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; }