1 条题解

  • 0
    @ 2026-10-25 21:38:42

    思路

    禁串终止必须沿fail传播;在根可达的安全转移图中找环才可构造无限串,总长30000,迭代三色DFS避免深链栈溢出。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<array<int,2>>g(1);vector<int>f(1),bad(1);while(n--){string s;cin>>s;int v=0;for(char c:s){int x=c-'0';if(!g[v][x]){int id=g.size();g[v][x]=id;g.push_back({});f.push_back(0);bad.push_back(0);}v=g[v][x];}bad[v]=1;}queue<int>q;for(int x=0;x<2;x++)if(g[0][x])q.push(g[0][x]);while(!q.empty()){int v=q.front();q.pop();bad[v]|=bad[f[v]];for(int x=0;x<2;x++)if(g[v][x]){int u=g[v][x];f[u]=g[f[v]][x];q.push(u);}else g[v][x]=g[f[v]][x];}vector<int>color(g.size());vector<pair<int,int>>st(1,{0,0});color[0]=1;while(!st.empty()){int v=st.back().first;if(st.back().second==2){color[v]=2;st.pop_back();continue;}int x=st.back().second++,u=g[v][x];if(bad[u])continue;if(color[u]==1){cout<<"TAK\n";return 0;}if(!color[u]){color[u]=1;st.push_back({u,0});}}cout<<"NIE\n";}
    
    • 1

    信息

    ID
    1526
    时间
    1000ms
    内存
    64MiB
    难度
    普及+
    标签
    递交数
    1
    已通过
    1
    上传者