Submission #579868

#TimeUsernameProblemLanguageResultExecution timeMemory
579868tranxuanbachType Printer (IOI08_printer)C++17
100 / 100
156 ms60376 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

#define endl '\n'
#define fi first
#define se second
#define For(i, l, r) for (auto i = (l); i < (r); i++)
#define ForE(i, l, r) for (auto i = (l); i <= (r); i++)
#define FordE(i, l, r) for (auto i = (l); i >= (r); i--)
#define Fora(v, a) for (auto v: (a))
#define bend(a) (a).begin(), (a).end()
#define isz(a) ((signed)(a).size())

using ll = long long;
using ld = long double;
using pii = pair <int, int>;
using vi = vector <int>;
using vpii = vector <pii>;
using vvi = vector <vi>;

#define trie __trie__

struct trie{
    struct trie_node{
        int nxt[26];
        bool leaf;
        int mxheight;

        trie_node(){
            memset(nxt, -1, sizeof(nxt));
            leaf = 0;
            mxheight = 0;
        }
    };

    vector <trie_node> a;

    trie(){
        a.assign(1, trie_node());
    }

    void insert(const string &s){
        int u = 0;
        Fora(c, s){
            if (a[u].nxt[c - 'a'] == -1){
                a.emplace_back();
                a[u].nxt[c - 'a'] = isz(a) - 1;
            }
            u = a[u].nxt[c - 'a'];
        }
        a[u].leaf = 1;
    }

    void dfs_height(int u){
        For(i, 0, 26){
            if (a[u].nxt[i] != -1){
                dfs_height(a[u].nxt[i]);
                a[u].mxheight = max(a[u].mxheight, a[a[u].nxt[i]].mxheight + 1);
            }
        }
    }

    void dfs(int u, string &sans){
        if (a[u].leaf){
            sans += 'P';
        }
        int j = max_element(a[u].nxt, a[u].nxt + 26, [&](int u, int v){
            if (v == -1){
                return false;
            }
            if (u == -1){
                return true;
            }
            return a[u].mxheight < a[v].mxheight;
        }) - a[u].nxt;
        For(i, 0, 26){
            if (i == j){
                continue;
            }
            if (a[u].nxt[i] != -1){
                sans += (char)(i + 'a');
                dfs(a[u].nxt[i], sans);
                sans += '-';
            }
        }
        if (a[u].nxt[j] != -1){
            sans += (char)(j + 'a');
            dfs(a[u].nxt[j], sans);
            sans += '-';
        }
    }
} cac;

const int N = 2e4 + 5e3 + 5;

int n;
string s[N];

string sans;

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    // freopen("KEK.inp", "r", stdin);
    // freopen("KEK.out", "w", stdout);
    cin >> n;
    ForE(i, 1, n){
        cin >> s[i];
    }

    ForE(i, 1, n){
        cac.insert(s[i]);
    }
    cac.dfs_height(0);
    cac.dfs(0, sans);
    while (!sans.empty() and sans.back() == '-'){
        sans.pop_back();
    }
    cout << isz(sans) << endl;
    Fora(c, sans){
        cout << c << endl;
    }
}

/*
==================================================+
INPUT:                                            |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
OUTPUT:                                           |
--------------------------------------------------|

--------------------------------------------------|
==================================================+
*/
#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...