题解中标记了最长的字符串,我标记了当前节点深度最大的一颗子树,不知道是写挂了还是思路有问题,麻烦有大佬能够指点一二。
下面是代码
#include <bits/stdc++.h>
using namespace std;
int n;
string s;
struct Trie
{
int child[500050][26],word[500050],idex,son[500050],depth[500050],mx[500050];
queue <char> q;
void init()
{
memset(son,-1,sizeof(son));
}
void push(string str)
{
int p=0;
for(int i=0;str[i];i++)
{
int t=str[i]-'a';
if(!child[p][t])child[p][t]=++idex;
p=child[p][t];
}
word[p]++;
}
void dfs1(int now,int father)
{
depth[now]=depth[father]+1;
mx[now]=depth[now];
for(int i=0;i<26;i++)
{
if(child[now][i])
{
dfs1(child[now][i],now);
if(son[now]==-1||mx[child[now][i]]>mx[child[now][son[now]]])son[now]=i,mx[now]=mx[child[now][i]];
}
}
return;
}
void dfs2(int now)
{
if(word[now])
{
n--;
q.push('P');
}
for(int i=0;i<26;i++)
{
if(i!=son[now]&&child[now][i])
{
q.push(i+'a');
dfs2(child[now][i]);
}
}
if(son[now]!=-1)q.push('a'+son[now]),dfs2(child[now][son[now]]);
if(!n)return;
q.push('-');
}
void solve()
{
dfs1(0,0);
dfs2(0);
cout<<q.size()<<endl;
while(!q.empty())
{
cout<<q.front()<<endl;
if(q.front()=='P')n--;
q.pop();
}
}
}T;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
T.init();
for(int i=1;i<=n;i++)
{
cin>>s;
T.push(s);
}
T.solve();
return 0;
}