Submission #1288510

#TimeUsernameProblemLanguageResultExecution timeMemory
1288510islam_2010Type Printer (IOI08_printer)C++20
100 / 100
661 ms104468 KiB
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>

// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
using namespace std;
// using namespace __gnu_pbds;
// typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

#define rall(x) x.rbegin(), x.rend()
#define all(x) x.begin(), x.end()
#define pii pair<int, int>
#define int long long
#define pb push_back
#define se second
#define fi first

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int mod = 1e9 + 7;
const int sz = 5e5+5;
const int inf = 1e9 + 7;

int bin_pow(int x, int b) {
	int res = 1;
	while (b > 0) {
		if (b & 1) {
			res = (res * x) % mod;
		}
		x = (x * x) % mod;
		b >>= 1;
	}
	return res;
 
}


struct modint{
	int x;
	modint(int val): x(val){}
	modint operator*(modint other){
		return 1LL*x*other.x%mod;
	}modint operator-(modint other){
		return (x-other.x)%mod;
	}modint operator+(modint other){
		return (x+other.x)%mod;
	}
};

int trie[sz][27], is_end[sz], path[sz];
string ans = "";
int last = 1;
void add(string s, int x){
	int node = 0;
	for(auto i: s){
		if(trie[node][i-'a'] == 0) {
			trie[node][i-'a']=last++;
		}node = trie[node][i-'a'];
		path[node] = max(path[node], x);
	}is_end[node] = 1;
	
}

void dfs(int node){
	if(is_end[node]){
		ans.pb('P');
	}int ok = -1;
	for(int i = 0; i < 26; i++){
		if(trie[node][i] == 0){
			continue;
		}if(path[trie[node][i]]){
			ok = i;
			continue;
		}ans.pb(i + 'a');
		dfs(trie[node][i]);
	}if(ok != -1){
		ans.pb(ok + 'a');
		dfs(trie[node][ok]);
	}if(!path[node]){
		ans.pb('-');
	}
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // freopen("main.in", "r", stdin);
    // freopen("main.out", "w", stdout);
	
	int n;
	cin >> n;
	int mx = 0;
	string c;
	vector<string> s(n);
	for(int i = 0; i < n; i++){
		cin >> s[i];
		if(mx < s[i].size()){
			c = s[i];
			mx = s[i].size();
		}
	}for(int i = 0; i < n; i++){
		if(s[i] != c){
			add(s[i], 0);
		}
	}add(c, 1);
	dfs(0);
	cout << ans.size()-1 << endl;
	ans.pop_back();
	for(auto i: ans){
		cout << i << endl;
		
	}
	
}
#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...