Submission #1138597

#TimeUsernameProblemLanguageResultExecution timeMemory
1138597bakekagaType Printer (IOI08_printer)C++20
100 / 100
98 ms57208 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define sz(x) (int) (x).size() 
#define pb push_back

using namespace std;

using ll = long long;

const int MAXN = 1e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3f;
const double EPS = 1e-6;

struct Node {
	bool mark, on;
	array<int, 26> nxt;
};

vector<Node> trie;

void insert(string &s) {
	int cur = 0;
	for (char ch : s) {
		int c = ch - 'a';
		if (trie[cur].nxt[c] == 0) {
			trie[cur].nxt[c] = sz(trie);
			trie.emplace_back();
		}
		cur = trie[cur].nxt[c];
	}
	trie[cur].on = true;
}

void dfs(int cur, vector<char> &out) {
	if (trie[cur].on) {
		out.push_back('P');
	}
	int marked_child = -1;
	for (int i = 0; i < 26; i++) {
		if (trie[cur].nxt[i]) {
			if (trie[trie[cur].nxt[i]].mark) {
				marked_child = i;
			}
			else {
				out.push_back('a' + i);
				dfs(trie[cur].nxt[i], out);
			}
		}
	}
	if (marked_child != -1) {
		out.push_back('a' + marked_child);
		dfs(trie[cur].nxt[marked_child], out);
	}
	if (!trie[cur].mark && cur > 0) {
		out.push_back('-');
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n;
	cin >> n;
	trie.emplace_back();
	vector<string> words(n);
	int mx_ind = 0;
	for (int i = 0; i < n; i++) {
		cin >> words[i];
		insert(words[i]);
		if (sz(words[mx_ind]) < sz(words[i])) {
			mx_ind = i;
		}
	}
	// mark all chars of longest word
	int cur = 0;
	for (char ch : words[mx_ind]) {
		int c = ch - 'a';
		cur = trie[cur].nxt[c];
		trie[cur].mark = true;
	}
	vector<char> out;
	out.reserve(n);
	dfs(0, out);
	cout << sz(out) << '\n';
	for (char ch : out) {
		cout << ch << '\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...