68pts 求调
查看原帖
68pts 求调
520748
_Ch1F4N_楼主2023/8/31 09:38

rt,WA on #4,5,6,8

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+114;
class AC_automaton{
public:
    int son[maxn][2],fail[maxn],sz[maxn],rt,tot,dfncnt;
    vector<int> edge[maxn];//trie 图
    vector<int> road[maxn];//fail 树
    int dfn[maxn],tag[maxn];
    void insert(string &s){
        int len=s.size(),now=rt;
        for(int i=0;i<len;i++){
            if(son[now][s[i]-'0']==0) son[now][s[i]-'0']=++tot;
            now=son[now][s[i]-'0'];
        }
        tag[now]=1;
        sz[now]++;
    }
    void build(){
        queue<int> q;
        for(int i=0;i<2;i++) if(son[rt][i]) fail[son[rt][i]]=rt,q.push(son[rt][i]);
        while(q.size()>0){
            int u=q.front();
            q.pop();
            for(int i=0;i<2;i++){
                if(son[u][i]){
                    fail[son[u][i]]=son[fail[u]][i];
                    if(tag[son[fail[u]][i]]) tag[son[u][i]]=1; 
                    q.push(son[u][i]);
                }
                else son[u][i]=son[fail[u]][i];
            }
        }
        for(int i=rt;i<=tot;i++){
            for(int j=0;j<2;j++){
                if(tag[i]==1||tag[son[i][j]]==1) continue;
                edge[i].push_back(son[i][j]);
            }
		}
    }
    bool dfs(int u){
        for(int v:edge[u]){
            if(dfn[v]==0){
                dfn[v]=dfn[u]+1;
                if(dfs(v)==true) return true;
            }
            else if(dfn[v]<dfn[u]||v==u) return true;
        }
        return false;
    }
}AC;
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        AC.insert(s);
    }
    AC.build();
    cout<<(AC.dfs(AC.rt)==true?"TAK\n":"NIE\n");
    return 0;
}
2023/8/31 09:38
加载中...