Submission #1352784

#TimeUsernameProblemLanguageResultExecution timeMemory
1352784kantaponzType Printer (IOI08_printer)C++20
100 / 100
59 ms49032 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long 

const int nx = 25005;
const int maxNode = nx * 25;
int nextNode = 2;

vector<string> str;
int n;
int trie[maxNode][26];
bool isWord[maxNode];
bool avoid[maxNode];
char val[maxNode];
int max_dist = -1;
string node = "";

void insert(string s) {
    int cur = 1;
    for (int i = 0; i < s.size(); i++) {
        
        int state = s[i] - 'a';
        if (trie[cur][state] == 0) {
            trie[cur][state] = nextNode++;
        }

        cur = trie[cur][state];
        val[cur] = s[i];
    }
}

int query(string s) {
    int cur = 1;
    for (int i = 0; i < s.size(); i++) {
        cur = trie[cur][s[i]-'a'];
    }
    return cur;
}

bool vis = 0;

void solve(int u) {
    if (u != 1) cout << val[u] << "\n";
    if (isWord[u]) cout << "P\n";
    int visit_after = -1;
    for (int i = 0; i < 26; i++) {
        int v = trie[u][i];
        if (v == 0) continue;
        if (avoid[v]) {
            visit_after = v;
            continue;
        }
        solve(v);
        if (vis) return;
        cout << "-\n";
    }
    if (visit_after != -1) solve(visit_after);
}


int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> n;
    
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        str.emplace_back(s);
        insert(s);
        isWord[query(s)] = 1;
        if (max_dist < (int)s.size()) {
            max_dist = s.size();
            node = s;
            //cout << "cum\n";
        }
        //cout << s.size() << " " << max_dist << " " << node << " \n";
    } 

    int cur = 1;
    for (int i = 0; i < node.size(); i++) {
        cur = trie[cur][node[i]-'a'];
        avoid[cur] = 1;
    }

    //cout << nextNode << " " << max_dist << " " << node << endl;

    cout << (nextNode - 2) * 2 - max_dist + n << "\n";

    solve(1);

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