Submission #1308767

#TimeUsernameProblemLanguageResultExecution timeMemory
1308767ghammazhassanType Printer (IOI08_printer)C++20
100 / 100
72 ms51584 KiB
#include <bits/stdc++.h>
using namespace std;

#define endl "\n"
#define fi first
#define se second

const int MAXN = 2000005;

int n;
int tr[MAXN][26];
int cn[MAXN];
int v = 1;

vector<char> operations;
string longestWord;

int totalOps = 0;
int idx = -1;
int longestWordIndex[25];

void addWord(const string &s) {
    int cur = 0;
    for (int i = 0; i < (int)s.size(); i++) {
        int c = s[i] - 'a';
        if (!tr[cur][c]) {
            tr[cur][c] = v++;
        }
        cur = tr[cur][c];
        if (i == (int)s.size() - 1) {
            cn[cur]++;
        }
    }
}

void dfs(int ch, int cur) {
    idx++;
    operations.push_back('-');
    totalOps++;
    if (idx < (int)longestWord.size() && longestWordIndex[idx] == 0) {
        int nxt = tr[cur][longestWord[idx] - 'a'];
        longestWordIndex[idx] = nxt;
        dfs(longestWord[idx] - 'a', nxt);
    }
    for (int i = 0; i < 26; i++) {
        if (!tr[cur][i]) continue;
        if (idx < (int)longestWord.size() && tr[cur][i] == longestWordIndex[idx]) continue;
        dfs(i, tr[cur][i]);
    }
    totalOps++;
    if (cn[cur]) {
        totalOps++;
        operations.push_back('P');
    }
    operations.push_back(char(ch + 'a'));
    idx--;
}

void solve() {
    cin >> n;
    vector<pair<int, string>> words(n);
    for (int i = 0; i < n; i++) {
        cin >> words[i].se;
        words[i].fi = words[i].se.size();
    }
    sort(words.begin(), words.end());
    for (auto &w : words) {
        addWord(w.se);
    }
    longestWord = words.back().se;
    dfs(0, 0);
    operations.pop_back();
    reverse(operations.begin(), operations.end());
    int resultOps = totalOps - longestWord.size() - 2;

    cout << resultOps << endl;
    for (int i = 0; i < resultOps; i++) {
        cout << operations[i] << endl;
    }
}

int main() {


    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    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...