Submission #686710

# Submission time Handle Problem Language Result Execution time Memory
686710 2023-01-25T19:37:36 Z finn__ Type Printer (IOI08_printer) C++17
100 / 100
194 ms 99568 KB
#include <bits/stdc++.h>
using namespace std;

struct Node
{
    Node *ch[26];
    unsigned height = 0;
    bool z = 0;
};

void trie_insert(Node *x, string const &s, size_t i = 0)
{
    if (i == s.size())
        x->z = 1;
    else
    {
        if (!x->ch[s[i] - 'a'])
        {
            x->ch[s[i] - 'a'] = (Node *)calloc(1, sizeof(Node));
        }
        trie_insert(x->ch[s[i] - 'a'], s, i + 1);
        x->height = max(x->height, x->ch[s[i] - 'a']->height + 1);
    }
}

void trie_destroy(Node *x)
{
    for (unsigned i = 0; i < 26; i++)
        if (x->ch[i])
        {
            trie_destroy(x->ch[i]);
            free(x->ch[i]);
        }
}

void trie_dfs(Node *x, string &traversal)
{
    if (x->z)
        traversal.push_back('P');

    vector<pair<unsigned, unsigned>> children;

    for (unsigned i = 0; i < 26; i++)
    {
        if (x->ch[i])
        {
            children.emplace_back(x->ch[i]->height, i);
        }
    }

    sort(children.begin(), children.end());

    for (auto const &[ignore, i] : children)
    {
        if (x->ch[i])
        {
            traversal.push_back(i + 'a');
            trie_dfs(x->ch[i], traversal);
            traversal.push_back('-');
        }
    }
}

int main()
{
    size_t n;
    cin >> n;

    Node root;
    memset(root.ch, 0, sizeof root.ch);

    for (size_t i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        trie_insert(&root, s);
    }

    string traversal;
    trie_dfs(&root, traversal);
    trie_destroy(&root);

    while (traversal.back() == '-')
        traversal.pop_back();

    cout << traversal.size() << '\n';
    for (char const &c : traversal)
        cout << c << '\n';
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 2 ms 1108 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 1748 KB Output is correct
2 Correct 5 ms 2260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 5844 KB Output is correct
2 Correct 25 ms 12488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 14688 KB Output is correct
2 Correct 12 ms 3284 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 78 ms 36408 KB Output is correct
2 Correct 171 ms 83264 KB Output is correct
3 Correct 96 ms 42748 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 66 ms 28392 KB Output is correct
2 Correct 194 ms 99568 KB Output is correct
3 Correct 105 ms 48928 KB Output is correct
4 Correct 170 ms 93976 KB Output is correct