P2322
为什么蒟弱的程序不开O2 70分WA,开了就过了??
#include<bits/stdc++.h>
using namespace std;
int read(){int x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x;}
struct tir
{
int son[26],fail,s;
}tire[605];
int num=1,n,fa[605*(1<<13)],ans[605*(1<<13)];char s[55];
void insert(char *s,int k)
{
int len=strlen(s),u=1;
for(int i=0;i<len;i++)
{
int v=s[i]-'A';
if(!tire[u].son[v])tire[u].son[v]=++num;
u=tire[u].son[v];
}
tire[u].s|=1<<(k-1);
}
queue<int>q,Q;
void build()
{
for(int i=0;i<26;i++)tire[0].son[i]=1;
q.push(1);
while(!q.empty())
{
int u=q.front(),F=tire[u].fail;q.pop();
for(int i=0;i<26;i++)
{
int v=tire[u].son[i];
if(!v)
{
tire[u].son[i]=tire[F].son[i];
continue;
}
tire[v].fail=tire[F].son[i];tire[v].s|=tire[tire[F].son[i]].s;
q.push(v);
}
}
}
bool vis[605][1<<13];
int t,c[55],co,cnt;
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
scanf("%s",s);
insert(s,i);
}
build();
q.push(0);Q.push(0);vis[0][0]=1;
while(!q.empty())
{
int u=q.front(),v=Q.front();
q.pop();Q.pop();
if(v==((1<<n)-1))
{
while(t)
{
c[++co]=ans[t];
t=fa[t];
}
for(int i=co-1;i>=1;i--)printf("%c",c[i]+'A');
return 0;
}
for(int i=0;i<26;i++)
{
if(!vis[tire[u].son[i]][v|tire[tire[u].son[i]].s])
{
vis[tire[u].son[i]][v|tire[tire[u].son[i]].s]=1;
q.push(tire[u].son[i]);
Q.push(v|tire[tire[u].son[i]].s);
fa[++cnt]=t;
ans[cnt]=i;
}
}
t++;
}
}