#include <bits/stdc++.h>
using namespace std;
const int ALPHA = 26;
struct Trie {
struct Node {
int child[ALPHA] = {};
int subtreeSize = 0;
bool isWord = 0;
};
vector<Node> trie;
Trie() {
trie.emplace_back();
}
void add(string& s) {
int node = 0;
for(auto c : s) {
int cIdx = c-'a';
if(!trie[node].child[cIdx]) {
trie[node].child[cIdx] = trie.size();
trie.emplace_back();
}
node = trie[node].child[cIdx];
}
trie[node].isWord = 1;
}
int calcSubtree(int node = 0) {
trie[node].subtreeSize = 0;
for(int i = 0; i < 26; i++) {
if(!trie[node].child[i]) continue;
trie[node].subtreeSize = max(trie[node].subtreeSize, calcSubtree(trie[node].child[i]));
}
trie[node].subtreeSize++;
return trie[node].subtreeSize;
}
void dfs(int node, vector<char>& ans) {
if(trie[node].isWord)
ans.push_back('P');
int mx = 0, mxChld = -1;
for(int i = 0; i < 26; i++) {
if(!trie[node].child[i]) continue;
if(trie[trie[node].child[i]].subtreeSize > mx) {
mx = trie[trie[node].child[i]].subtreeSize;
mxChld = i;
}
}
for(int i = 0; i < 26; i++) {
if(i == mxChld || !trie[node].child[i]) continue;
ans.push_back('a'+i);
dfs(trie[node].child[i], ans);
}
if(~mxChld) {
ans.push_back('a'+mxChld);
dfs(trie[node].child[mxChld], ans);
}
ans.push_back('-');
}
};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >>n;
Trie tr;
while(n--) {
string s;
cin >>s;
tr.add(s);
}
tr.calcSubtree();
vector<char> ans;
tr.dfs(0, ans);
while(ans.back() != 'P')
ans.pop_back();
cout <<ans.size() <<'\n';
for(auto 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... |