Submission #1176534

#TimeUsernameProblemLanguageResultExecution timeMemory
1176534justokType Printer (IOI08_printer)C++20
0 / 100
1098 ms328 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<char> ans;
vector<vector<int>> dp;
int rec(int idx, bool cur) {
    int &ret = dp[idx][cur];
    if (~ret) return ret;
    int sum = (tree[idx].en + 1 + !cur), mx_dif = 0;
    for (int j = 0; j < 26; ++j) {
        int nxt = tree[idx].vis[j];
        if (nxt) {
            sum += rec(nxt, 0);
            if (cur) {
                mx_dif = max(mx_dif, rec(nxt,0) - rec(nxt,1));
            }
        }
    }
    return ret = sum - mx_dif;
}
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() + 1, 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();
}

Compilation message (stderr)

printer.cpp: In function 'void files()':
printer.cpp:11:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
printer.cpp:11:46: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
      |                                       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...