原帖:https://www.luogu.com.cn/discuss/847496
求助大佬帮忙看下这份代码哪里错了。thx.
悬 2 关。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=31;
string s[N],ans;
int m,tot,cnt,trie[N][M];
set<int> flag[N];
bool cmp(string x,string y){
return x.size()<y.size();
}
void insert(string ss,int f){
int cur=0;
for(int i=0;i<ss.size();i++){
if(!trie[cur][ss[i]-'a'])
trie[cur][ss[i]-'a']=++tot;
cur=trie[cur][ss[i]-'a'];
flag[cur].insert(f);
}
return;
}
string search(string ss,int p1,int p2){
int cur=0; string t="";
for(int i=0;i<ss.size();i++){
cur=trie[cur][ss[i]-'a'];
if(flag[cur].count(p1)&&flag[cur].count(p2))
t+=(ss[i]-'a');
}
return t;
}
int main(){
cin>>m;
for(int i=1;i<=m;i++) cin>>s[i];
sort(s+1,s+m+1,cmp);
for(int i=1;i<=m;i++) insert(s[i],i),cout<<s[i]<<'\n';
for(int i=1;i<=m;i++){
if(i==1) ans+=s[i]+"P";
else{
string t=search(s[i],i,i-1);
for(int j=t.size();j<s[i-1].size();j++) ans+="-";
for(int j=t.size();j<s[i].size();j++) ans+=s[i][j];
ans+="P";
}
}
cout<<ans.size()<<'\n';
for(int i=0;i<ans.size();i++) cout<<ans[i]<<'\n';
return 0;
}