Submission #1108146

#TimeUsernameProblemLanguageResultExecution timeMemory
1108146vjudge1Type Printer (IOI08_printer)C++17
100 / 100
118 ms55996 KiB
#include <iostream>
#include <vector>
#include <algorithm>


int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    std::cin >> n;
    std::vector<std::vector<std::pair<char,int>>> trie(500001);
    std::vector<std::vector<int>> subtreeSize(500001, std::vector<int>(2));
    std::vector<bool> finalVertex(500001);
    int curVertices = 0;
    for(int i = 0; i < n; i++){
        std::string s; 
        std::cin >> s;
        int m = (int) s.length();
        int curVertex = 0;
        for(int j = 0; j < m; j++){
            bool found = false;
            for(std::pair<char,int> & p : trie[curVertex]){
                if(p.first == s[j]){
                    found = true;
                    curVertex = p.second;
                    break;
                }
            }
            if(found == false){
                curVertices += 1;
                trie[curVertex].push_back({s[j], curVertices});
                curVertex = curVertices;
            }
            if(j == (m - 1)){
                finalVertex[curVertex] = true;
            }
        }
    }
    auto dfs = [&trie, &subtreeSize](int u, int p, auto && self) -> void {
        subtreeSize[u][0] += 1;
        subtreeSize[u][1] = 1;
        for(std::pair<char,int> & v : trie[u]){
            if(v.second != p){
                self(v.second, u, self);
                subtreeSize[u][0] += subtreeSize[v.second][0];
                subtreeSize[u][1] = std::max(subtreeSize[u][1], 1 + subtreeSize[v.second][1]);
            }
        }
    };
    dfs(0, 0, dfs);
    for(int i = 0; i <= curVertices; i++){
        sort(trie[i].begin(), trie[i].end(), [&subtreeSize](const std::pair<char,int> & a, const std::pair<char,int> & b) -> bool {
            return 2*subtreeSize[a.second][0] + (2*subtreeSize[b.second][0] - subtreeSize[b.second][1]) 
            < 2*subtreeSize[b.second][0] + (2*subtreeSize[a.second][0] - subtreeSize[a.second][1]);
        });
    }
    int built = 0;
    std::vector<char> operations;
    auto build = [&trie, &curVertices, &finalVertex, &built, &operations](char c, int u, int p, auto && self) -> void{
        if(u != 0){
            operations.push_back(c);
            built += 1;
        }
        if(finalVertex[u]){
            operations.push_back('P');
        }
        for(std::pair<char,int> & v : trie[u]){
            if(v.second != p){
                self(v.first, v.second, u, self);
            }
        }
        if(built < curVertices){
            operations.push_back('-');
        }
    };
    build('0', 0, 0, build);
    std::cout << operations.size() << '\n';
    for(char & c : operations){
        std::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...