Submission #647444

#TimeUsernameProblemLanguageResultExecution timeMemory
647444phoenixType Printer (IOI08_printer)C++17
100 / 100
172 ms99528 KiB
#include<bits/stdc++.h>

using namespace std;

struct node {
    node* to[ 26 ];
    bool terminal = false;
    int h = 0;
};
void add_string(node* v, string &s) {
    for(int i = 0;i < (int)s.size();i++) {
        if(!v->to[s[ i ] - 'a']) 
            v->to[s[ i ] - 'a'] = new node();
        v = v->to[s[ i ] - 'a'];
        v->h = max(v->h, (int)s.size() - 1 - i);
    }
    v->terminal = true;
}
vector<char> op;
void dfs(node* v) {
    if(v->terminal) op.push_back('P');

    vector<int> x;
    for(int i = 0;i < 26;i++) if(v->to[ i ]) x.push_back(i);
    sort(x.begin(), x.end(), [&](int a, int b){return v->to[ a ]->h < v->to[ b ]->h;});
    
    for(int i : x) {
        op.push_back(i + 'a');
        dfs(v->to[ i ]);
        op.push_back('-');
    }
}

node trie;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int n;
    cin >> n;
    for(int i = 0;i < n;i++) {
        string s;
        cin >> s;
        add_string(&trie, s);
    }
    dfs(&trie);

    while(!op.empty() && op.back() == '-') op.pop_back();
    cout << (int)op.size() << '\n';
    for(char c : op)
        cout << c << '\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...