#include<bits/stdc++.h>
using namespace std;
struct node
{
int child[26],F[26],cnt;
};
const int MAXN=555555;
int cnode=1;
node trie[MAXN];
vector<char> ans;
void ins(string s)
{
int pos=1,len=s.length();
for(auto v:s)
{
int a=v-'a';
if(!trie[pos].child[a]) trie[pos].child[a]=++cnode;
trie[pos].F[a]=max(trie[pos].F[a],len),pos=trie[pos].child[a];
}
trie[pos].cnt++;
}
void solve(int pos)
{
if(trie[pos].cnt) ans.push_back('P');
vector< tuple<int,int,int> > vi;
for(int i=0;i<26;i++) if(trie[pos].child[i]) vi.push_back((tuple<int,int,int>){trie[pos].F[i],trie[pos].child[i],i});
sort(vi.begin(),vi.end());
for(auto v:vi)
{
ans.push_back(char(get<2>(v)+'a'));
solve(get<1>(v));
ans.push_back('-');
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,mx=0;
cin>>n;
for(int i=1;i<=n;i++)
{
string res;
cin>>res;
ins(res);
mx=max(mx,(int)res.length());
}
solve(1);
while(mx--) ans.pop_back();
cout<<ans.size()<<"\n";
for(auto v:ans) cout<<v<<"\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... |