```cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n;
char str[55];
int cnt,son[100005][26];
int tai,from[100005];
char edw[100005];
int fail[100005],dp[100005];
bool vis[100005][1<<12];
int top;
char ans[100005];
inline void ins(int x)
{
int u=1;
int len=strlen(str+1);
for(int i=1;i<=len;i++)
{
int id=str[i]-'A';
if(son[u][id]==0)
{
son[u][id]=++cnt;
}
u=son[u][id];
}
dp[u]|=1<<x-1;
}
inline void init()
{
queue<int> q;
fail[1]=1;
for(int i=0;i<26;i++)
{
int v=son[1][i];
if(v!=0)
{
fail[v]=1;
q.push(v);
}
else
{
son[1][i]=1;
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
int fiu=fail[u];
for(int i=0;i<26;i++)
{
int v=son[u][i];
if(v!=0)
{
fail[v]=son[fiu][i];
q.push(v);
}
else
{
son[u][i]=son[fiu][i];
}
}
}
}
int main()
{
scanf("%d",&n);
cnt=1;
for(int i=1;i<=n;i++)
{
scanf("%s",str+1);
ins(i);
}
init();
queue<int> q,q2,q3;
q.push(1);
q2.push(0);
q3.push(1);
from[++tai]=1;
while(!q.empty())
{
int u=q.front(),nsta=q2.front(),nid=q3.front();
q.pop();
q2.pop();
q3.pop();
if(nsta==(1<<n)-1)
{
while(nid!=1)
{
ans[++top]=edw[nid];
nid=from[nid];
}
break;
}
for(int i=0;i<26;i++)
{
int v=son[u][i];
int nxtdp=dp[v]|nsta;
if(!vis[v][nxtdp])
{
vis[v][nxtdp]=true;
from[++tai]=nid;
edw[tai]='A'+i;
q.push(v);
q2.push(nxtdp);
q3.push(tai);
}
}
}
while(top>0)
{
printf("%c",ans[top--]);
}
printf("\n");
return 0;
}
```
by lovely_ckj @ 2021-11-19 09:54:10
orz
by qsceszthn @ 2021-11-19 10:13:51
sto orz
by LC_535 @ 2021-11-19 10:24:11
您数组小了,from数组和edw数组要开到状态数,也就是600*(1<<12),我估计比100005大(因为我也是这样)
by __stick @ 2022-02-11 17:33:53