代码求调
查看原帖
代码求调
552688
clx201022楼主2024/5/18 14:59

https://www.luogu.com.cn/record/159402286

#include<bits/stdc++.h>
using namespace std;
class Aho_Corasick_Automaton
{
    public:
    std::vector<std::vector<unsigned> >tr;
    std::vector<unsigned>fail;
    std::vector<int>state;
    public:
    Aho_Corasick_Automaton()
    {reset();}
    unsigned push_new()
    {
        tr.push_back(std::vector<unsigned>(26,0));
        fail.push_back(0);
        state.push_back(0);
        return tr.size()-1;
    }
    void reset()
    {
        tr.clear();
        fail.clear();
        state.clear();
        push_new();
    }
    void insert(const std::string s,const int flag)
    {
        unsigned u=0;
        const unsigned slen=s.size();
        for(unsigned i=0;i<slen;i++)
        {
            if(tr[u][s[i]-'A']==0)tr[u][s[i]-'A']=push_new();
            u=tr[u][s[i]-'A'];
        }
        state[u]|=flag;
    }
    void get_fail()
    {
        std::queue<unsigned>q;
        fail[0]=0;
        for(int i=0;i<26;i++)if(tr[0][i]!=0){fail[tr[0][i]]=0,q.push(tr[0][i]);}
        unsigned u;
        while(!q.empty())
        {
            u=q.front();
            q.pop();
            for(int i=0;i<26;i++)
            {
                if(tr[u][i]==0)
                {
                    tr[u][i]=tr[fail[u]][i];
                    continue;
                }
                fail[tr[u][i]]=tr[fail[u]][i];
                q.push(tr[u][i]);
            }
        }
    }
}ac;
int n;string S;
bool vis[601][1<<12|1];
struct pack
{unsigned place;int data;string s;};
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>S;
        ac.insert(S,1<<i);
    }
    ac.get_fail();
    queue<pack>q;
    vis[0][0]=1;
    q.push(pack{0,0,""});
    while(!q.empty())
    {
        const auto zzz1=q.front();
        q.pop();
        unsigned u2;
        for(int i=0;i<26;i++)
        {
            auto zzz2=zzz1;
            zzz2.place=ac.tr[zzz2.place][i];
            zzz2.s+=(char)i+'A';
            u2=zzz2.place;
            while(u2!=0)
            {
                zzz2.data|=ac.state[u2];
                u2=ac.fail[u2];
            }
            zzz2.data|=ac.state[0];
            if(!vis[zzz2.place][zzz2.data])
            {
                vis[zzz2.place][zzz2.data]=1;
                if(zzz2.data==(1<<n)-1)
                {
                    cout<<zzz2.s<<endl;
                    return 0;
                }
                q.push(zzz2);
            }
        }
    }
    return 0;
}
2024/5/18 14:59
加载中...