Submission #1195105

#TimeUsernameProblemLanguageResultExecution timeMemory
1195105damamilaType Printer (IOI08_printer)C++20
80 / 100
1094 ms20968 KiB
#include <bits/stdc++.h>

using namespace std;

vector<set<tuple<int, int, int>>> g (2); //l, letter, index
bool fin [200000];
int cnt = 2;
string ans;

void insrt(string s) {
	int idx = 1;
	for (int i = 0; i < s.size() ; i++) {
		int next = s[i]-'a';
		int idx2 = 0;
		int len2 = s.size();
		int other = 0;
		for (auto [len, let, ind] : g[idx]) {
			if (let == next) {
				len2 = max(len2, len);
				other = len;
				idx2 = ind;
				break;
			}
		}
		if (idx2 == 0) {
			idx2 = cnt;
			cnt++;
			g.push_back({});
			g[idx].insert({len2, next, idx2});
		} else {
			g[idx].erase({other, next, idx2});
			g[idx].insert({len2, next, idx2});
		}	
		idx = idx2;	
	}
	fin[idx] = 1;
}

void dfs(int u) {
	if (fin[u]) ans = ans+'P'+'\n';
	for (auto [len, let, v] : g[u]) {
		ans = ans+char('a'+let)+'\n';
		dfs(v);
		ans = ans+'-'+'\n';
	}
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);  
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		insrt(s);
	}
	dfs(1);
	while (ans[ans.size()-1] == '-' || ans[ans.size()-1] == '\n') ans.pop_back();
	ans = ans + '\n';
	cout << ans.size()/2 << '\n' << ans;
}
#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...