#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct trie{
vector<pair<map<char,int>,int>>children;
void add(int ind,string &s,int pos){
if(pos>=s.size())return;
if(children[ind].first.find(s[pos])!=children[ind].first.end()){
children[children[ind].first[s[pos]]].second++;
add(children[ind].first[s[pos]],s,pos+1);
}else{
children[ind].first[s[pos]]=children.size();
children.push_back({{},0});
children[children[ind].first[s[pos]]].second++;
add(children[ind].first[s[pos]],s,pos+1);
}return;
}void add(string &s){
if(children.empty())children.push_back({{},0});
add(0,s,0);
return;
}void quit(int ind,string &s,int pos){
if(pos>=s.size())return;
if(children[ind].first.find(s[pos])!=children[ind].first.end()){
children[children[ind].first[s[pos]]].second--;
quit(children[ind].first[s[pos]],s,pos+1);
if(children[children[ind].first[s[pos]]].second==0)children[ind].first.erase(s[pos]);
}//else{
// children[ind].first[s[pos]]=children.size();
// children.push_back({{},0});
// children[children[ind].first[s[pos]]].second++;
// quit(children[ind].first[s[pos]],s,pos+1);
//}
return;
}
pair<string,int> query(int ind,string &s,int pos){
if(pos>=s.size())return {"",pos};
if(children[ind].first.find(s[pos])!=children[ind].first.end()){
pair<string,int>act = query(children[ind].first[s[pos]],s,pos+1);
return {s[pos]+act.first,act.second};
}else if(!children[ind].first.empty()){
auto it = children[ind].first.begin();
pair<string,int>act = query((*it).second,s,pos+1);
return {(*it).first+act.first,pos};
}else{
return {"",pos};
}
}
};
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
ll n;
cin >> n;
trie words;
vector<string>a(n);
ll sum = 0;
int index = 0;
for(int i=0;i<n;i++){
cin >> a[i];
words.add(a[i]);
sum+=a[i].size();
if(a[i].size()>a[index].size())index = i;
}
vector<pair<string,int>>b(n);
b[0]={a[index],0};
words.quit(0,a[index],0);
int j = 0;
for(int i=1;i<n;i++){
b[i] =words.query(0,b[i-1].first,0);
words.quit(0,b[i].first,0);
}
reverse(b.begin(),b.end());
vector<char>ans;
for(int i=0;i<n;i++){
if(i>0)for(int j=b[i-1].second;j<b[i-1].first.size();j++)ans.push_back('-');
int st = 0;
if(i>0)st=b[i-1].second;
for(int j=st;j<b[i].first.size();j++)ans.push_back(b[i].first[j]);
ans.push_back('P');
}for(auto it : ans)cout << it << '\n';
return 0;
}
| # | 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... |