제출 #1271524

#제출 시각아이디문제언어결과실행 시간메모리
1271524WH8Type Printer (IOI08_printer)C++20
100 / 100
176 ms132316 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second

vector<vector<int>> to(500005, vector<int>(26, -1));
vector<int> reg(500005, -1), dep(500005, 0);
vector<bool> endpoint(500005, 0);
vector<char> ans;
int n,nw=1, sat=0;

void dfs(int x){
	for(int i=0;i<26;i++){
		if(to[x][i]!=-1){
			dfs(to[x][i]);
			dep[x]=max(dep[to[x][i]]+1, dep[x]);
		}
	}
}
void dfs2(int x){
	vector<pair<int,int>> depto;
	if(endpoint[x]){
		ans.pb('P');
		sat++;
	}
	for(int i=0;i<26;i++){
		if(to[x][i]!=-1){
			depto.push_back({dep[to[x][i]], to[x][i]});
		}
	}
	sort(depto.begin(),depto.end());
	for(auto [ul, to] : depto){
		ans.pb((char)('a'+reg[to]));
		dfs2(to);
	}
	if(sat!=n)ans.pb('-');
}

signed main(){
	cin>>n;
	for(int i=0;i<n;i++){
		string s;
		cin>>s;
		int x=0;
		for(int j=0;j<(int)s.size();j++){
			int c=s[j]-'a';
			if(to[x][c]==-1){
				to[x][c]=nw;
				reg[nw]=c;
				x=nw;
				nw++;
			}
			else x=to[x][c];
			if(j==(int)s.size()-1){
				endpoint[x]=true;
			}
		}
	}
	dfs(0);
	dfs2(0);
	cout<<ans.size()<<"\n";
	for(auto it:ans)cout<<it<<"\n";
}
#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...