Trie本身就是树,自然带有树的性质。
求以Trie为前缀,就在s的末尾节点做一次dfs
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
inline int idx(char ch){return ch-'a';}
int ch[300005][30],val[300005],tot,n,q,tn;
char s[30],ans[30];
void dfs(int k,int now)
{
if (val[k])
{
for (int i=0;i<now;i++) printf("%c",ans[i]);
printf(" ");
tn--;
if (tn==0) return ;
}
for (int i=0;i<26;i++)
if (ch[k][i])
{
ans[now]=i+'a';
dfs(ch[k][i],now+1);
if (tn==0) return ;
}
}
void work(char *s)
{
memset(ans,0,sizeof(ans));
int k=0,len=strlen(s);
for (int i=0;i<len;i++)
{
int id=idx(s[i]);
if (ch[k][id]==0) {printf("%s\n",s);return ;}
k=ch[k][id];
}
tn=8;
strcpy(ans,s);
dfs(k,len);
printf("\n");
}
void insert(char *s)
{
int k=0,len=strlen(s);
for (int i=0;i<len;i++)
{
int id=idx(s[i]);
if (ch[k][id]==0) ch[k][id]=++tot;
k=ch[k][id];
}
val[k]=1;
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",s);
insert(s);
}
scanf("%d",&q);// 8
for (int i=1;i<=q;i++)
{
scanf("%s",s);
work(s);
}
return 0;
}