lpx2024 @ 2023-10-05 16:56:47
样例过了
#include <bits/stdc++.h>
using namespace std;
const int maxN=1000000;
int n,cnt,trie[maxN][26],ed[maxN],f[maxN];
char c[maxN];
string s1="";
void Insert(string s){
int t=0;
for(int i=0;i<s.size();i++){
int p=s[i]-'a';
if(s==s1) f[t]=p;
if(!trie[t][p]) trie[t][p]=++cnt;
t=trie[t][p];
}
ed[t]++;
}
void dfs(int x){
for(int i=0;i<26;i++){
if(!trie[x][i] || f[x]==i) continue;
c[++cnt]=i+'a';
dfs(trie[x][i]);
if(!n) return;
c[++cnt]='-';
}
if(f[x]){
c[++cnt]=f[x]+'a';
dfs(trie[x][f[x]]);
if(!n) return;
c[++cnt]='-';
}
for(int i=1;i<=ed[x];i++) c[++cnt]='P',n--;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
if(s.size()>s1.size()) s1=s;
Insert(s);
}
cnt=0;
dfs(0);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++) cout<<c[i]<<endl;
return 0;
}