Submission #1176535

#TimeUsernameProblemLanguageResultExecution timeMemory
1176535justokType Printer (IOI08_printer)C++20
100 / 100
203 ms124000 KiB
#include <bits/stdc++.h> //  +
using namespace std;     // +++
#define inf 1e18         //  +
#define FADY ios_base::sync_with_stdio(0), cin.tie(0); files();
#define all(a) a.begin(), a.end()
#define int long long
string YN[2] = {"No", "Yes"};
void files()
{
// #ifndef ONLINE_JUDGE
//     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
// #endif
}

struct Node {
    int vis[26]{};
    int frq = 0, en = 0;
};
vector<Node> tree;
void add(string s) {
    int idx = 0;
    for (auto &i : s) {
        int ch = i - 'a';
        if (tree[idx].vis[ch] == 0) {
            tree[idx].vis[ch] = tree.size();
            tree.emplace_back();
        }   
        idx = tree[idx].vis[ch];
        tree[idx].frq++;
    }
    tree[idx].en++;
}
vector<vector<int>> dp;
int rec(int idx, bool cur) {
    int &ret = dp[idx][cur];
    if (~ret) return ret;
    ret = (tree[idx].en + 1 + !cur);
    int mx_dif = 0;
    for (int j = 0; j < 26; ++j) {
        int nxt = tree[idx].vis[j];
        if (nxt) {
            ret += rec(nxt, 0);
            if (cur) {
                mx_dif = max(mx_dif, rec(nxt,0) - rec(nxt,1));
            }
        }
    }
    ret -= mx_dif;
    return ret;
}
vector<char> ans;
void build(int idx, bool cur) {
    int mx_dif = 0, nxt_ch = -1;
    if (cur) {
        for (int j = 0; j < 26; ++j) {
            int nxt = tree[idx].vis[j];
            if (nxt) {
                if (rec(nxt,0) - rec(nxt,1) > mx_dif) {
                    mx_dif = rec(nxt, 0) - rec(nxt, 1);
                    nxt_ch = j;
                }
            }
        }
    }
    if (tree[idx].en) {
        ans.push_back('P');
    }
    for (int j = 0; j < 26; ++j) {
        int nxt = tree[idx].vis[j];
        if (nxt && j != nxt_ch) {
            ans.push_back(j + 'a');
            build(nxt, 0);
            ans.push_back('-');
        }
    }
    if (nxt_ch != -1) {
        ans.push_back(nxt_ch + 'a');
        build(tree[idx].vis[nxt_ch], 1);
    }
}
void JustOK() {
    tree.emplace_back();
    int n; cin >> n;
    for (int i = 0; i < n; ++i) {
        string s; cin >> s;
        add(s);
    }
    dp.resize(tree.size() + 5, vector<int>(2, -1));
    rec(0, 1);
    build(0, 1);
    cout << ans.size() << '\n';
    for (auto &i : ans)
        cout << i << '\n';
}
signed main() {
    FADY;
    int tc = 1;
    // cin >> tc;
    while (tc--)
        JustOK();
}
#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...