Submission #381313

#TimeUsernameProblemLanguageResultExecution timeMemory
381313jlallas384Type Printer (IOI08_printer)C++17
100 / 100
226 ms51680 KiB
#include <bits/stdc++.h>
using namespace std;

int nxt[500500][26];
int lst[500500];
int dep[500500];
int sz = 1;
vector<char> ans;
void add(string s){
    int cur = 0;
    for(int i = 0; i < (int) s.size(); i++){
        int c = s[i] - 'a';
        if(!nxt[cur][c]) nxt[cur][c] = sz++;
        cur = nxt[cur][c];
    }
    lst[cur] = true;
}

void dfs1(int v){
    for(int i = 0; i < 26; i++) if(nxt[v][i]){
        dfs1(nxt[v][i]);
        dep[v] = max(dep[v],dep[nxt[v][i]]+1);
    }
}

void dfs2(int v){
    vector<pair<int,int>> ord; //(max hi,v);
    for(int i = 0; i < 26; i++) if(nxt[v][i]){
        ord.emplace_back(dep[nxt[v][i]],i);
    }
    sort(ord.begin(), ord.end());
    for(auto [hi,i]: ord){
        ans.push_back(i + 'a');
        if(lst[nxt[v][i]]) ans.push_back('P');
        dfs2(nxt[v][i]);
        ans.push_back('-');
    }
}

int main(){
    int n;
    cin >> n;
    while(n--){
        string s;
        cin >> s;
        add(s);
    }
    dfs1(0);
    dfs2(0);
    while(ans.back() != 'P') ans.pop_back();
    cout << ans.size() << '\n';
    for(char x: ans){
        cout << x << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...