Submission #1178908

#TimeUsernameProblemLanguageResultExecution timeMemory
1178908sasdeType Printer (IOI08_printer)C++20
100 / 100
120 ms112728 KiB
#include <bits/stdc++.h>
#define emb emplace_back
using namespace std;

const int MAXN = 1000005; // Số lượng node tối đa, cần đủ lớn
struct Trie {
    int child[26]; // Chỉ số tới các nút con
    int cnt = 0;    // Số lần kết thúc từ tại đây
    int h = 0;      // Độ sâu lớn nhất từ node này
} tr[MAXN];

int node_cnt = 1; // Node gốc là node 0

void add(int root, const string &s) {
    int cur = root;
    for (char x : s) {
        int c = x - 'a';
        if (tr[cur].child[c] == 0) {
            tr[cur].child[c] = node_cnt++;
        }
        cur = tr[cur].child[c];
    }
    tr[cur].cnt++;
}

vector<char> res;

void query1(int root) {
    while (tr[root].cnt--) {
        res.emb('P');
    }
    int u = -1, v = -1;
    for (int i = 0; i < 26; ++i) {
        if (tr[root].child[i] == 0) continue;
        if (tr[tr[root].child[i]].h > u) {
            u = tr[tr[root].child[i]].h;
            v = i;
        }
    }
    for (int i = 0; i < 26; ++i) {
        if (tr[root].child[i] == 0 || i == v) continue;
        res.emb('a' + i);
        query1(tr[root].child[i]);
        res.emb('-');
    }
    if (v != -1) {
        res.emb('a' + v);
        query1(tr[root].child[v]);
        res.emb('-');
    }
}

void query(int root, int u) {
    tr[root].h = max(tr[root].h, u);
    for (int i = 0; i < 26; ++i) {
        if (tr[root].child[i] == 0) continue;
        query(tr[root].child[i], u + 1);
        tr[root].h = max(tr[root].h, tr[tr[root].child[i]].h);
    }
}

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

    int n;
    string s;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> s;
        add(0, s); // Root là node 0
    }

    query(0, 0);
    query1(0);
    while (!res.empty() && res.back() == '-') res.pop_back();

    cout << res.size() << '\n';
    for (char x : res) cout << x << '\n';

    return 0;
}
#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...