记录,被卡空间了 QWQ
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25001;
string ans, maxi = "";
int n, trie[500001][26], tot, cnt;
bool vis[500001], exist[500001];
void get_vis(string s)
{
int cur = 0, len = s.size();
for(int i = 0; i < len; i++)
{
int c = s[i] - 'a';
cur = trie[cur][c];
vis[cur] = true;
}
}
void insert(string s)
{
int cur = 0;
for(int i = 0; i < s.size(); i++)
{
int c = s[i] - 'a';
if(!trie[cur][c]) trie[cur][c] = ++ tot;
cur = trie[cur][c];
}
exist[cur] = true;
}
void dfs(int cur)
{
if(exist[cur]) {
ans += "P";
cnt ++;
}
if(cnt == n) return ;
for(int c = 0; c <= 25; c++)
{
int nxt = trie[cur][c];
if(!nxt || vis[nxt]) continue;
ans += (char)(c + 'a');
dfs(nxt);
ans += "-";
}
for(int c = 0; c <= 25; c++)
{
int nxt = trie[cur][c];
if(!nxt || !vis[nxt]) continue;
ans += (char)(c + 'a');
dfs(nxt);
}
}
signed main()
{
cin.tie(0) -> sync_with_stdio(0);
cin >> n;
for(int i = 1; i <= n; i++)
{
string tmp; cin >> tmp;
insert(tmp);
if(tmp.size() > maxi.size()) maxi = tmp;
}
get_vis(maxi);
dfs(0);
cout << ans.size() << "\n";
for(int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
return 0;
}