답안 #1108140

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108140 2024-11-03T02:09:07 Z vjudge1 Type Printer (IOI08_printer) C++17
30 / 100
83 ms 28448 KB
#include <iostream>
#include <vector>
#include <algorithm>


int main(){
    std::cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    std::cin >> n;
    std::vector<std::string> strings(n); 
    std::vector<std::vector<std::pair<char,int>>> trie(500001);
    std::vector<int> subtreeSize(500001);
    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] += 1;
        for(std::pair<char,int> & v : trie[u]){
            if(v.second != p){
                self(v.second, u, self);
                subtreeSize[u] += subtreeSize[v.second];
            }
        }
    };
    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 subtreeSize[a.second] < subtreeSize[b.second];
        });
    }
    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';
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 14160 KB Output is correct
2 Correct 4 ms 14160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 14216 KB Output is correct
2 Correct 4 ms 14160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 14160 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 14160 KB Output is correct
2 Correct 4 ms 14160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 14160 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 14416 KB Output is correct
2 Incorrect 6 ms 14416 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 15184 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 18 ms 16812 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 20500 KB Output is correct
2 Correct 83 ms 28448 KB Output is correct
3 Incorrect 43 ms 21952 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 29 ms 19308 KB Output isn't correct
2 Halted 0 ms 0 KB -