maoxiaoben @ 2024-05-12 18:26:21
代码如下,不知道还可以优化哪里
#include<bits/stdc++.h>
using namespace std;
int n,cur=0,step=1,tr[500010][26];
char d[500010];
bool mo[500010],fla[500010],flag=false;
string ans,maxs;
void shu(string s)
{
int fu=0;
for(int i=0;i<s.size();++i)
{
int t=s[i]-'a';
if(tr[fu][t]==0)tr[fu][t]=++cur;
d[tr[fu][t]]=char(t+'a');
fu=tr[fu][t];
}
mo[fu]=true;
}
void mark(string s)
{
int fu=0;
for(int i=0;i<s.size();++i)
{
int t=s[i]-'a';
fla[tr[fu][t]]=true;
fu=tr[fu][t];
}
}
void dfs(int mao)
{
if(mo[mao])
{
++step;
ans=ans+'P';
}
if(step>n)
{
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();++i)cout<<ans[i]<<endl;
exit(0);
}
int x,tmp=-1;
for(int i=0;i<26;++i)
{
x=tr[mao][i];
if(fla[x])tmp=x;
if(x!=0&&!fla[x])
{
ans=ans+d[x];
dfs(x);
}
}
if(tmp!=-1)
{
ans=ans+d[tmp];
dfs(tmp);
}
if(tmp==-1&&fla[mao])flag=true;
if(!flag) ans=ans+'-';
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;++i)
{
string s;
cin>>s;
shu(s);
if(s.size()>maxs.size())maxs=s;
}
mark(maxs);
dfs(0);
return 0;
}