#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
vector<vector<int>> to(500005, vector<int>(26, -1));
vector<int> reg(500005, -1), dep(500005, 0);
vector<bool> endpoint(500005, 0);
vector<char> ans;
int n,nw=1, sat=0;
void dfs(int x){
for(int i=0;i<26;i++){
if(to[x][i]!=-1){
dfs(to[x][i]);
dep[x]=max(dep[to[x][i]]+1, dep[x]);
}
}
}
void dfs2(int x){
vector<pair<int,int>> depto;
if(endpoint[x]){
ans.pb('P');
sat++;
}
for(int i=0;i<26;i++){
if(to[x][i]!=-1){
depto.push_back({dep[to[x][i]], to[x][i]});
}
}
sort(depto.begin(),depto.end());
for(auto [ul, to] : depto){
ans.pb((char)('a'+reg[to]));
dfs2(to);
}
if(sat!=n)ans.pb('-');
}
signed main(){
cin>>n;
for(int i=0;i<n;i++){
string s;
cin>>s;
int x=0;
for(int j=0;j<(int)s.size();j++){
int c=s[j]-'a';
if(to[x][c]==-1){
to[x][c]=nw;
reg[nw]=c;
x=nw;
nw++;
}
else x=to[x][c];
if(j==(int)s.size()-1){
endpoint[x]=true;
}
}
}
dfs(0);
dfs2(0);
cout<<ans.size()<<"\n";
for(auto it:ans)cout<<it<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |