#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll M = 2e6 + 2;
const ll N = 3e4 + 2;
ll trie[M][26];
ll cur_node = 0;
set < ll > S[N];
void add_string(string str, ll ind) {
ll node = 0;
for ( char ch : str) {
if ( trie[node][ch - 'a'] == 0) trie[node][ch - 'a'] = ++cur_node;
node = trie[node][ch - 'a'];
S[ind].insert(node);
}
}
int main() {
ll n, m, r, x, y, i, p, j, ans, t;
cin >> n;
string str[n + 2];
for (i = 1; i <= n; i ++) {
cin >> str[i];
}
sort(str + 1, str + n + 1);
for (i = 1; i <= n; i ++) {
add_string(str[i], i);
}
vector < ll > Ans;
for (j = 0; j < str[1].size(); j ++) Ans.push_back(str[1][j] - 'a');
Ans.push_back(26);
for (i = 2; i <= n; i ++) {
ll node = 0;
for (j = 0; j < str[i - 1].size(); j ++) {
node = trie[node][str[i - 1][j] - 'a'];
if ( S[i].find(node) == S[i].end()) break;
}
r = str[i - 1].size()- j - 1;
p =j;
while ( r --) Ans.push_back(-1);
for (j =p; j < str[i].size(); j ++) {
Ans.push_back(str[i][j] - 'a');
}
Ans.push_back(26);
}
cout << Ans.size() << endl;
for (i = 0; i < Ans.size(); i ++) {
if ( Ans[i] == -1) cout << "-\n";
else {
if ( Ans[i] == 26) cout << "P\n";
else cout<< char(Ans[i] + 'a') << "\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... |