Submission #1175445

#TimeUsernameProblemLanguageResultExecution timeMemory
1175445joonyouType Printer (IOI08_printer)C++20
100 / 100
122 ms57968 KiB
#include <bits/stdc++.h>
using namespace std;

const int ALPHA = 26;

struct Trie {
    struct Node {
        int child[ALPHA] = {};
        int subtreeSize = 0;
        bool isWord = 0;
    };

    vector<Node> trie;

    Trie() {
        trie.emplace_back();
    }

    void add(string& s) {
        int node = 0;
        for(auto c : s) {
            int cIdx = c-'a';

            if(!trie[node].child[cIdx]) {
                trie[node].child[cIdx] = trie.size();
                trie.emplace_back();
            }

            node = trie[node].child[cIdx];
        }
        trie[node].isWord = 1;
    }

    int calcSubtree(int node = 0) {
        trie[node].subtreeSize = 0;
        for(int i = 0; i < 26; i++) {
            if(!trie[node].child[i]) continue;

            trie[node].subtreeSize = max(trie[node].subtreeSize, calcSubtree(trie[node].child[i]));
        }
        trie[node].subtreeSize++;
        return trie[node].subtreeSize;
    }
    
    void dfs(int node, vector<char>& ans) {
        if(trie[node].isWord)
            ans.push_back('P');

        int mx = 0, mxChld = -1;
        for(int i = 0; i < 26; i++) {
            if(!trie[node].child[i]) continue;

            if(trie[trie[node].child[i]].subtreeSize > mx) {
                mx = trie[trie[node].child[i]].subtreeSize;
                mxChld = i;
            }
        }
        
        for(int i = 0; i < 26; i++) {
            if(i == mxChld || !trie[node].child[i]) continue;

            ans.push_back('a'+i);
            dfs(trie[node].child[i], ans);
        }
        
        if(~mxChld) {
            ans.push_back('a'+mxChld);
            dfs(trie[node].child[mxChld], ans);
        }
        
        ans.push_back('-');
    }
};

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >>n;
    
    Trie tr;
    while(n--) {
        string s;
        cin >>s;
        tr.add(s);
    }

    tr.calcSubtree();

    vector<char> ans;
    tr.dfs(0, ans);

    while(ans.back() != 'P')
        ans.pop_back();

    cout <<ans.size() <<'\n';
    for(auto i : ans)
        cout <<i <<'\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...