제출 #1195103

#제출 시각아이디문제언어결과실행 시간메모리
1195103damamilaType Printer (IOI08_printer)C++20
80 / 100
1095 ms20964 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 i, int idx) {
	if (s.size() == i) {
		fin[idx] = 1;
		return;
	}
	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});
	}
	insrt(s, i+1, idx2);
}

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, 0, 1);
	}
	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...