#include<bits/stdc++.h>
using namespace std;
int trie[500005][26], h[500005], sz = 0;
bool leaf[500005];
vector<char> ans;
void add(string s)
{
int u = 0;
for(int i = 0; i < s.size(); i++){
if(trie[u][s[i] - 'a'] == 0) trie[u][s[i] - 'a'] = ++sz;
u = trie[u][s[i] - 'a'];
h[u] = max(h[u], (int)s.size()-i-1);
}
leaf[u] = 1;
}
void dfs(int u, bool ret)
{
if(leaf[u] == 1) ans.push_back('P');
int bc = -1;
for(int i = 0; i < 26; i++) if(trie[u][i] > 0 && (bc == -1 || h[trie[u][i]] > h[trie[u][bc]])) bc = i;
if(bc == -1) return;
for(int i = 0; i < 26; i++) if(trie[u][i] > 0 && i != bc){
ans.push_back((char)(i+'a'));
dfs(trie[u][i], 1);
ans.push_back('-');
}
ans.push_back((char)(bc+'a'));
dfs(trie[u][bc], ret);
if(ret == 1) ans.push_back('-');
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n; cin>>n; h[0] = -1;
for(int i = 1; i <= n; i++){
string s; cin>>s;
add(s);
}
dfs(0, 0);
cout<<ans.size()<<'\n';
for(char i : ans) cout<<i<<'\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... |