Submission #1176412

#TimeUsernameProblemLanguageResultExecution timeMemory
1176412ahmedplusplusType Printer (IOI08_printer)C++20
20 / 100
65 ms60020 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define all(a)  a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define pf push_front
#define pb push_back
#define SZ(x) ((int)(x).size())
#define AhmedPlusPlus ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define YN(X) cout << ( X ? "YES\n" : "NO\n" );
#define hi cerr<<"hi\n";

/*                        ->    NO CLEAN CODE HERE    <-                        */

string ans;
struct Trie {
    struct Node {
        int children[26] = {};
        int f = 0 ,mx = 0, end = 0;
    };

    vector<Node> trie;

    Trie() {
        trie.emplace_back();
    }

    void insert(string& s) {
        int idx = 0;
        for(auto i : s) {
            int nxt = i-'a';

            if(trie[idx].children[nxt] == 0) {
                trie[idx].children[nxt] = trie.size();
                trie.emplace_back();
            }
            idx = trie[idx].children[nxt];
            trie[idx].f++;
        }
        trie[idx].end++;
    }

    void pre(int node = 0){
        int mxx = 0;
        for (int i =0;i<26;i++){
            if (trie[node].children[i]) {
                pre(trie[node].children[i]);
                mxx = max(mxx , trie[trie[node].children[i]].mx);
            }
        }
        trie[node].mx = mxx+1;
    }

    void solve(int node = 0){
        int mxx = 0,men=-1;
        for (int i =0;i<26;i++)
            if (trie[node].children[i] != 0 && trie[trie[node].children[i]].mx > mxx)
                mxx = trie[trie[node].children[i]].mx, men = i;
        for (int i =0;i<26;i++){
            if (i == men || trie[node].children[i] == 0)continue;
            ans+=(char)(i+'a');
            solve(trie[node].children[i]);
            ans+=(char)('-');
        }
        if (~men){
            ans+=(char)(men+'a');
            solve(trie[node].children[men]);
            ans+=(char)('-');
        }
        while (trie[node].end--)
            ans+='P';
    }

};

void pewpew() {

    int n;cin>>n;
    string s;
    Trie tr;
    for (int i =0;i<n;i++){
        cin>>s;
        tr.insert(s);
    }
    tr.pre();
    tr.solve();
    int cnt = 0 , ptr = SZ(ans)-1;
    while(ptr && ans[ptr] == '-')
        cnt++ , ptr--;
    cout << SZ(ans) - cnt << "\n";
    for (int i =0;i<SZ(ans)-cnt ; i++ )cout << ans[i] << "\n";


}

signed main() {
/* ^^^ */    AhmedPlusPlus    /* ^^^ */

//    ->> practice makes perfect

    int Hi = 1;
    //cin >> Hi;
    while (Hi--)
        pewpew();

}
#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...