Submission #1319408

#TimeUsernameProblemLanguageResultExecution timeMemory
1319408algoproclubType Printer (IOI08_printer)C++20
20 / 100
36 ms21740 KiB
// UUID: f9fcc435-f29b-4326-92b4-bcd3eb95d661
#include <bits/stdc++.h>
using namespace std;
const int MAXN=21*25000+1;
int trie[MAXN][26];
vector<int> word, utcs; vector<char> ki;
int cnt=1;
void add(string s){
	int cur=0;
	for(char z:s){
		if(!trie[cur][z-'a']) trie[cur][z-'a']=cnt++;
		cur=trie[cur][z-'a'];
		if(word[cur]==- 1) word[cur]=0;
	}
	word[cur]++;
}
void add2(string s){
	int cur=0;
	for(char z:s){
		if(!trie[cur][z-'a']) trie[cur][z-'a']=cnt++;
		utcs[cur]=z-'a';
		cur=trie[cur][z-'a'];
		if(word[cur]==-1) word[cur]=0;
	}
	word[cur]++;
}
void dfs(int x){
	for(int i=0; i<26; i++){
		if(word[trie[x][i]]==-1||utcs[x]==i) continue;
		ki.push_back(i+'a');
		dfs(trie[x][i]);
	}
	if(utcs[x]!=-1){
		ki.push_back(utcs[x]+'a');
		dfs(trie[x][utcs[x]]);
	}
	if(word[x]>0) ki.push_back('P');
	if(x)ki.push_back('-');
}
int main() {
	int n; cin>>n;
	vector<pair<int, string>> kak;
	word.resize(n*21+1, -1);
	utcs.resize(n*21+1, -1);
	for(int i=0; i<n; i++){
		string s; cin>>s; 
		kak.push_back({s.size(),s});
	}
	sort(kak.rbegin(), kak.rend());
	add2(kak[0].second);
	for(int i=1; i<n; i++) add(kak[i].second);
	dfs(0);
	int a=ki.size()-1;
	while(ki[a]=='-') a--;
	cout<<a+1<<"\n";
	for(int i=0; i<=a; i++) cout<<ki[i]<<"\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...