Submission #973700

# Submission time Handle Problem Language Result Execution time Memory
973700 2024-05-02T09:45:54 Z GrindMachine Type Printer (IOI08_printer) C++17
100 / 100
104 ms 61928 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) (int)a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x,y) ((x+y-1)/(y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define rev(i,s,e) for(int i = s; i >= e; --i)
#define trav(i,a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a,b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a,b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif

/*



*/

const int MOD = 1e9 + 7;
const int N = 5e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;

struct node{
    int f[26];
    int here = 0;

    node(){
        memset(f,-1,sizeof f);
    }
};

vector<node> tr;

void insert(string s){
    int u = 0;
    trav(ch,s){
        int j = ch-'a';
        if(tr[u].f[j] == -1){
            tr[u].f[j] = sz(tr);
            tr.pb(node());
        }

        u = tr[u].f[j];
    }

    tr[u].here = 1;
}

vector<pii> deepest(N);

void dfs1(int u){
    deepest[u] = {-1,-1};
    rep(j,26){
        int v = tr[u].f[j];
        if(v == -1) conts;
        dfs1(v);
        pii px = {deepest[v].ff+1,v};
        amax(deepest[u],px);
    }
}

vector<char> ans;

void dfs2(int u, int ret){
    if(tr[u].here){
        ans.pb('P');
    }
    
    int big = deepest[u].ss;
    int big_ch = 0;

    rep(j,26){
        int v = tr[u].f[j];
        if(v == -1) conts;
        if(v == big){
            big_ch = j;
            conts;
        }
        ans.pb(char('a'+j));
        dfs2(v,0);
        ans.pb('-');
    }

    if(big != -1){
        ans.pb(char('a'+big_ch));
        dfs2(big,ret);
        if(!ret){
            ans.pb('-');
        }
    }
}

void solve(int test_case)
{
    int n; cin >> n;
    tr.pb(node());

    rep1(i,n){
        string s; cin >> s;
        insert(s);
    }

    dfs1(0);
    dfs2(0,1);

    cout << sz(ans) << endl;
    trav(ch,ans) cout << ch << endl;
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;

    rep1(i, t) {
        solve(i);
    }

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4184 KB Output is correct
2 Correct 2 ms 4188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4188 KB Output is correct
2 Correct 2 ms 4188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4188 KB Output is correct
2 Correct 1 ms 4188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4188 KB Output is correct
2 Correct 2 ms 4188 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4444 KB Output is correct
2 Correct 3 ms 4904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 5232 KB Output is correct
2 Correct 4 ms 6260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 9488 KB Output is correct
2 Correct 15 ms 12364 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 17 ms 12876 KB Output is correct
2 Correct 7 ms 6260 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 50 ms 33472 KB Output is correct
2 Correct 91 ms 60608 KB Output is correct
3 Correct 48 ms 34040 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 31 ms 20424 KB Output is correct
2 Correct 104 ms 61440 KB Output is correct
3 Correct 56 ms 33216 KB Output is correct
4 Correct 85 ms 61928 KB Output is correct