Submission #1313864

#TimeUsernameProblemLanguageResultExecution timeMemory
1313864algoproclubType Printer (IOI08_printer)C++20
100 / 100
85 ms55956 KiB
// UUID: 297c6817-13b8-4b88-90aa-49301e090228
#include <bits/stdc++.h>
using namespace std;

struct Node
{
    int nxt[26];
    int last = -1;
    Node(){
        fill(nxt, nxt+26, -1);
    }
};

vector <bool> ending(5e5 + 5, false);
vector <Node> trie(1);

void Insert(string s)
{
    int u = 0;
    for(auto x : s){
        int c = x - 'a';
        if(trie[u].nxt[c] == -1){
            trie[u].nxt[c] = trie.size();
            Node newnode;
            trie.push_back(newnode);
        }
        u = trie[u].nxt[c];
    }
    ending[u] = true;
}

string ans = "";

void dfs(int u)
{
    if(ending[u]) ans += 'P';
    int c;
    for(int i = 0; i < 26; i++){
        if(trie[u].nxt[i] == trie[u].last){
            c = i;
            continue;
        }
        if(trie[u].nxt[i] != -1){
            ans += i + 'a';
            dfs(trie[u].nxt[i]);
        }
    }
    if(trie[u].last != -1){
        ans += c + 'a';
        dfs(trie[u].last);
    }
    ans += '-';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n; cin >> n;
    string longest = "";
    for(int i = 0; i < n; i++){
        string s; cin >> s;
        Insert(s);
        if(s.size() > longest.size()) longest = s;
    }
    int u = 0;
    for(auto x : longest){
        int c = x - 'a';
        trie[u].last = trie[u].nxt[c];
        u = trie[u].nxt[c];        
    }
    dfs(0);
    while(!ans.empty() && ans.back() == '-') ans.pop_back();
    cout << ans.size() << "\n";
    for(auto x : ans){
        cout << x << "\n";
    }
    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...