求调
查看原帖
求调
572133
潘德理2010楼主2024/1/4 18:19

好像做法出了点问题。

貌似只会输出 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");
}
2024/1/4 18:19
加载中...