1 条题解
-
0
#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
- 上传者