Submission #656370

#TimeUsernameProblemLanguageResultExecution timeMemory
656370gamigafyType Printer (IOI08_printer)C++17
100 / 100
155 ms50792 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define sz(x) (int)(x.size())

const int N = 5e5+5;
int n, tot = 0;
char c[N];
bool last[N];
vector<char> ans;
int adj[N][26], dep[N];

void dfs(int u) {
	sort(adj[u], adj[u] + 26, [&](int i, int j) {
		return dep[i] < dep[j];
	});
	for(int i = 0; i < 26; i++) {
		if(adj[u][i]) {
			dfs(adj[u][i]);
		}
	}
}

void dfs2(int u) {
	for(int i = 0; i < 26; i++) {
		if(adj[u][i]) {
			ans.push_back(c[adj[u][i]]);
			if(last[adj[u][i]]) {
				ans.push_back('P');
			}
			dfs2(adj[u][i]);
			ans.push_back('-');
		}
	}
}

int main() {
	cin>>n;

	for(int i = 0; i < n; i++) {
		string s; cin>> s;
		int t = 0;
		for(int j = 0; j < sz(s); j++) {
			int p = s[j] - 'a';
			if(!adj[t][p])
				adj[t][p] = ++tot;
			t = adj[t][p];
			c[t] = s[j];
			dep[t] = max(dep[t], sz(s));
		}
		last[t] = true;
	}

	dfs(0);
	dfs2(0);

	while(ans.back() == '-') {
		ans.pop_back();
	}

	cout<<sz(ans)<<'\n';
	for(auto s : ans) {
		cout<<s<<'\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...