1 条题解

  • 0
    @ 2026-4-26 15:26:35
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int n,ch[30010][2],ed[30010],fail[30010],id;
    void ins(string s){
    	int p=0;
    	for(int i=0;i<s.size();i++){
    		int j=s[i]-'0';
    		if(!ch[p][j])ch[p][j]=++id;
    		p=ch[p][j];
    	}
    	ed[p]=1;
    }
    void build(){
    	queue<int> q;
    	for(int i=0;i<2;i++)if(ch[0][i])q.push(ch[0][i]);
    	while(!q.empty()){
    		int x=q.front();
    		q.pop();
    		ed[x]|=ed[fail[x]];
    		for(int i=0;i<2;i++){
    			int &y=ch[x][i];
    			if(!y)y=ch[fail[x]][i];
    			else fail[y]=ch[fail[x]][i],q.push(y);
    		}
    	}
    }
    int deg[30010],vis[30010],fl=0;
    void dfs(int x){
    	vis[x]=1;
    	for(int i=0;i<2;i++){
    		int y=ch[x][i];
    		if(!ed[y]&&!vis[y]){
    			dfs(y);
    		}
    		else if(vis[y]==1){
    			fl=1;
    			return ;
    		}
    	}
    	vis[x]=2;
    }
    int solve(){
    	int cnt=0;
    	for(int i=0;i<=id;i++){
    		if(ed[i]){
    			cnt++;
    			vis[i]=2;
    			continue;
    		}
    		for(int j=0;j<2;j++){
    			if(ch[i][j]&&!ed[ch[i][j]]){
    				deg[ch[i][j]]++;
    			}
    		}
    	}
    	queue<int> q;
    	fl=0;
    	for(int i=0;i<=id;i++)if(!ed[i]&&!deg[i]){
    		dfs(i);
    	}
    	return fl;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cin>>n;
    	string s;
    	for(int i=1;i<=n;i++){
    		cin>>s;
    		ins(s);
    	}
    	build();
    	if(solve())cout<<"TAK";
    	else cout<<"NIE";
    	return 0;
    }
    
    
    • 1

    信息

    ID
    4603
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    66
    已通过
    10
    上传者