Submission #1171124

#TimeUsernameProblemLanguageResultExecution timeMemory
1171124mousebeaverType Printer (IOI08_printer)C++20
10 / 100
55 ms41956 KiB
#define ll long long
#define subINF numeric_limits<ll>::min()/2
#define pll pair<ll, ll>
#define ppl pair<pll, ll>
#define BITS 32
#include <bits/stdc++.h>
using namespace std;

void dfs(vector<bool>& mark, vector<vector<ll>>& trie, vector<char>& output, ll node, vector<ll>& h)
{
    if(mark[node])
        output.push_back('P');

    vector<pll> child(0);

    for(ll i = 0; i < 26; i++)
    {
        if(trie[node][i] != -1)
        {
            child.push_back({h[trie[node][i]], i});
        }
    }
    
    sort(child.begin(), child.end());

    for(pll p : child)
    {
        ll i = p.second;
        output.push_back((char) (((int) 'a') + i));
        dfs(mark, trie, output, trie[node][i], h);
    }

    output.push_back('-');
}

void preDFS(vector<vector<ll>>& trie, ll node, vector<ll>& h)
{
    h[node] = 0;

    for(ll i = 0; i < 26; i++)
    {
        if(trie[node][i] != -1)
        {
            preDFS(trie, trie[node][i], h);
            h[node] = max(h[node], h[trie[node][i]]);
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    ll n;
    cin>>n;
    vector<vector<ll>> trie(1, vector<ll> (26, -1));
    vector<bool> mark(1, false);


    for(ll i = 0; i < n; i++)
    {
        string s;
        cin>>s;
        ll k = 0;
        for(char c : s)
        {
            int ind = (int) c - (int) 'a';
            if(trie[k][ind] == -1)
            {
                trie[k][ind] = trie.size();
                mark.push_back(false);
                trie.push_back({});
                trie.back().assign(26, -1);
            }
            k = trie[k][ind];
        }
        mark[k] = true;
    }

    vector<ll> h(trie.size(), 0);
    preDFS(trie, 0, h);

    vector<char> output(0);
    dfs(mark, trie, output, 0, h);
    
    while(output.back() == '-')
        output.pop_back();
    cout<<output.size()<<"\n";
    for(char c : output)
        cout<<c<<"\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...