제출 #1352773

#제출 시각아이디문제언어결과실행 시간메모리
1352773kantaponzType Printer (IOI08_printer)C++20
10 / 100
1103 ms327680 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];
vector<int> adj[maxNode];
int dist[maxNode];
int pa[maxNode];
bool avoid[maxNode];
char val[maxNode];
int max_dist = -1;
int node = 0;

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.back();
}

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 (auto v : adj[u]) {
        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);
        string cur = "";
        for (int i = 0; i < s.size(); i++) {
            insert(cur + s[i]);
            int root = query(cur), child = query(cur + s[i]);
            adj[root].emplace_back(child);
            pa[child] = root;
            cur.push_back(s[i]);
        }
        isWord[query(s)] = 1;
    } 

    queue<int> q;
    q.emplace(1);
    int ct = 0;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (auto v : adj[u]) {
            dist[v] = dist[u] + 1;
            q.emplace(v);
        }
    }
    
    for (int i = 1; i < nextNode; i++) {
        if (dist[i] > max_dist) {
            max_dist = dist[i];
            node = i;
        }
    }

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

    int cur = node;
    while (cur != 1) {
        avoid[cur] = 1;
        cur = pa[cur];
    }

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