#include <bits/stdc++.h>
using namespace std;
int n; string st;
vector<char> ans;
struct trie{
struct node{
int mx, ed;
node *c[26];
node(){
mx = 0; ed = 0;
for(int i = 0;i<26;i++) c[i] = 0;
}
};
typedef node* pnode;
pnode rt = 0;
void upd(pnode &k, string &s, int idx, int sz){
if(!k) k = new node();
if(idx == sz) return k->ed = 1, k->mx = max(k->mx, sz), void();
upd(k->c[s[idx] - 'a'], s, idx + 1, sz);
k->mx = max(k->mx, k->c[s[idx] - 'a']->mx);
}
void dfs(pnode k){
if(k->ed) ans.push_back('P');
pair<int, int> hv = {-1, -1};
for(int i = 0;i<26;i++){
if(!k->c[i]) continue;
hv = max(hv, {k->c[i]->mx, i});
}
if(hv.second == -1) return ans.push_back('-'), void();
for(int i = 0;i<26;i++){
if(!k->c[i] || i == hv.second) continue;
//cout << k->mx << '\n';
ans.push_back(i + 'a');
dfs(k->c[i]);
}
ans.push_back(hv.second + 'a');
dfs(k->c[hv.second]);
ans.push_back('-');
}
}t;
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for(int i = 0;i<n;i++){
cin >> st;
t.upd(t.rt, st, 0, st.size());
}
t.dfs(t.rt);
for(int i = 0;i<=t.rt->mx;i++) ans.pop_back();
cout << ans.size() << '\n';
for(auto x : ans) cout << x << '\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... |