답안 #889088

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
889088 2023-12-18T19:36:00 Z Macker Type Printer (IOI08_printer) C++17
70 / 100
113 ms 54476 KB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define all(v) v.begin(), v.end()

struct node{
    map<char, node*> m = {};
    int d = 0;
    int mxd = 0;
    node* mxch = NULL;
    bool end = 0;
};

void add(string s, int i, node* cur){
    if(i == s.size()){
        cur->end = true;
        return;
    }
    if(cur->m.find(s[i]) == cur->m.end()){
        cur->m[s[i]] = new node();
    }
    add(s, i + 1, cur->m[s[i]]);
}

void depthDfs(node* a){
    if(a->m.size() == 1){
        node* nx = (*a->m.begin()).second;
        a->mxch = nx;
        depthDfs((*a->m.begin()).second);
        a->mxd = nx->mxd;
        a->d = nx->d + 1;
    }
    else{
        for (auto &b : a->m) {
            depthDfs(b.second);
            int nd = max(b.second->d + 1, b.second->mxd);
            if(nd > a->mxd){
                a->mxd = nd;
                a->mxch = b.second;
            }
        }
    }
}


vector<char> res;
void resDfs(node* a, bool first){
    char c;
    if(a->end) res.push_back('P');
    for (auto &b : a->m) {
        if(b.second == a->mxch && first){
            c = b.first;
            continue;
        }
        res.push_back(b.first);
        resDfs(b.second, false);
        res.push_back('-');
    }
    if(first && a->mxch){
        res.push_back(c);
        resDfs(a->mxch, true);
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    node* root = new node();
    for (int i = 0; i < n; i++) {
        string s; cin >> s;
        add(s, 0, root);
    }

    depthDfs(root);
    resDfs(root, true);

    cout << res.size() << endl;
    for (auto &i : res)
        cout << i <<"\n";
}

Compilation message

printer.cpp: In function 'void add(std::string, int, node*)':
printer.cpp:16:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     if(i == s.size()){
      |        ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 600 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 1 ms 860 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 3928 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 9684 KB Output is correct
2 Correct 10 ms 2396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 24036 KB Output is correct
2 Correct 113 ms 54476 KB Output is correct
3 Correct 71 ms 28108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 41 ms 18900 KB Output isn't correct
2 Halted 0 ms 0 KB -