Submission #98926

#TimeUsernameProblemLanguageResultExecution timeMemory
98926luciocfType Printer (IOI08_printer)C++14
100 / 100
288 ms99692 KiB
#include <bits/stdc++.h>

using namespace std;

struct node
{
	node *b[26];
	int sz;
	bool end;
};

int n, qtd;
vector<char> ans;

void insert(node *at, string const &s)
{
	int add = -1;

	for (char a: s)
	{
		at->sz = max(at->sz, (int)s.size()-(++add));

		if (!at->b[a-'a']) at->b[a-'a'] = new node();

		at = at->b[a-'a'];
	}

	at->sz = max(at->sz, 1);
	at->end = true;
}

void dfs(node *at, char c)
{
	if (c != '*') ans.push_back(c);
	if (at->end) ans.push_back('P'), qtd++;

	set< pair<int, int> > S;

	for (int i = 0; i < 26; i++)
	{
		if (!at->b[i]) continue;

		S.insert({at->b[i]->sz, i});
	}

	for (auto p: S)
		dfs(at->b[p.second], (char)(p.second+'a'));

	if (qtd < n) ans.push_back('-');
}

int main(void)
{
	cin >> n;

	node *t = new node();

	for (int i = 1; i <= n; i++)
	{
		string s;
		cin >> s;

		insert(t, s);
	}

	dfs(t, '*');

	cout << ans.size() << "\n";
	for (auto c: ans) cout << c << "\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...