好像做法出了点问题。
貌似只会输出 tak。
#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[30040];
int tr[30040][2],fa[30040],c,tg[30040],vis[30040];
queue<int> q;
void ins(){
int u=0;
for(int i=1;i<=m;i++){
if(tr[u][s[i]-'0']==0) tr[u][s[i]-'0']=++c;
u=tr[u][s[i]-'0'];
}
tg[u]=1;
}
void build(){
for(int i=0;i<2;i++){
if(tr[0][i]) q.push(tr[0][i]);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<2;i++){
if(tr[u][i]){
fa[tr[u][i]]=tr[fa[u]][i];
if(tg[tr[fa[u]][i]]) tg[tr[u][i]]=1;
q.push(tr[u][i]);
}
else tr[u][i]=tr[fa[u]][i];
}
}
}
void fd(){
for(int i=0;i<2;i++) q.push(tr[0][i]);
while(!q.empty()){
int u=q.front();
q.pop();
if(tg[u]) continue;
if(vis[u]){
printf("TAK");
exit(0);
}
vis[u]=1;
for(int i=0;i<2;i++){
if(tr[u][i]){
q.push(tr[u][i]);
}
}
}
}
int main(){
scanf("%d",&n);
s[0]='*';
for(int i=1;i<=n;i++){
scanf("%s",s+1);
m=strlen(s)-1;
ins();
}
build();
fd();
printf("NIE");
}