Submission #437996

#TimeUsernameProblemLanguageResultExecution timeMemory
437996dutchType Printer (IOI08_printer)C++17
100 / 100
146 ms48836 KiB
#include <bits/stdc++.h>
using namespace std;

const int LIM = 20 * 25000;

array<int, 26> g[LIM];
int a[LIM], toEnd = 0;
bitset<LIM> bad;
pair<int, string> mx = {0, ""};

void dfs(int u){
	while(a[u]--) cout << "P\n";
	if(u == toEnd) exit(0);
	for(int i=0; i<26; ++i){
		if(!g[u][i] || bad[g[u][i]]) continue;
		cout << char('a' + i) << '\n';
		dfs(g[u][i]);
		cout << "-\n";
	}
	for(int i=0; i<26; ++i){
		if(!g[u][i] || !bad[g[u][i]]) continue;
		cout << char('a' + i) << '\n';
		dfs(g[u][i]);
		cout << "-\n";
	}
}

signed main(){
	cin.tie(0)->sync_with_stdio(0);
	int n, cnt = 0; cin >> n;
	for(int i=0; i<n; ++i){
		string s; cin >> s;
		mx = max(mx, {s.size(), s});
		int u = 0;
		for(char c : s){
			if(!g[u][c-'a']) g[u][c-'a'] = ++cnt;
			u = g[u][c-'a'];
		}
		++a[u];
	}
	for(char c : mx.second){
		bad[toEnd = g[toEnd][c-'a']] = 1;
	}
	cout << 2*cnt - mx.first + n << '\n';
	dfs(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...