Submission #1132695

#TimeUsernameProblemLanguageResultExecution timeMemory
1132695DangKhoizzzzType Printer (IOI08_printer)C++20
100 / 100
154 ms76688 KiB
#include <bits/stdc++.h>
#include <cstdint>

using namespace std;

const int maxn = 5e5 + 7;
const int mod = 1e9 + 7;

struct node
{
    int cnt , child[26];
    node(){
        cnt = 0;
        for(int i = 0; i < 26; i++) child[i] = -1;
    }
};

vector <node> trie;
vector <int> g[maxn];

int maxdep[maxn];

char val[maxn];

int ans = 0;

void ADD(string s)
{
    vector <int> path = {0};

    int cur = 0;
    for(char ch: s)
    {
        int c = ch - 'a';
        if(trie[cur].child[c] == -1)
        {
            trie[cur].child[c] = (int)trie.size();
            g[cur].push_back((int)trie.size());
            trie.push_back(node());
            ans++;
        }
        cur = trie[cur].child[c];
        path.push_back(cur);
        val[cur] = ch;
    }
    trie[cur].cnt++;
    for(int u: path) maxdep[u] = max(maxdep[u] , (int)path.size());
}

int remain;

void dfs(int u)
{
    if(u != 0) cout << val[u] << '\n';

    while(trie[u].cnt > 0 && u != 0)
    {
        cout << 'P' << '\n';
        trie[u].cnt--;
        remain--;
    }
    
    for(int v: g[u])
    {
        dfs(v);
    }

    if(remain > 0) cout << '-' << '\n';
}

int n;

void solve()
{
    cin >> n; remain = n;
    trie.push_back(node());
    for(int i = 1; i <= n; i++)
    {
        string ss; cin >> ss; ADD(ss); //cout << ans << '\n';
    }
    for(int i = 0; i < maxn; i++)
    {
        if(g[i].empty()) continue;

        int ok = 0;

        for(int v: g[i]) ok = max(ok , maxdep[v]);
        
        for(int j = 0; j < g[i].size(); j++)
        {
            if(maxdep[g[i][j]] == ok)
            {
                g[i].push_back(g[i][j]);
                g[i].erase(g[i].begin() + j);
                break;
            }
        }
    }
    cout << ans*2 - (maxdep[0] - 1)  + n  << '\n';
    dfs(0);
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    solve();
    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...