题目要求的是每个单词的直接前缀是什么,什么是直接前缀呢,直接前缀就是以该直接前缀的子树有且只有该单词
所以,我们只需要沿着以该单词构建的字典树走,输出所有cnt>1的结点和最后一个cnt==1的结点既得答案
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
char ch[1500][30];
int le=1;
struct node
{
int next[26];
int cnt;
void init(){
cnt=0;
memset(next,-1,sizeof(next));
}
}T[1000000];
void Insert(char *s){
int root=0;
for(int i=0;i<strlen(s);i++){
int id=s[i]-'a';
if(T[root].next[id]==-1){
T[le].init();
T[root].next[id]=le++;
}
root=T[root].next[id];
T[root].cnt++;
}
}
void Find(char *s){
int root=0;
for(int i=0;i<strlen(s);i++){
int id=s[i]-'a';
if(T[root].next[id]!=-1){
root=T[root].next[id];
if(T[root].cnt>1){
printf("%c",'a'+id);
}
else{
printf("%c",'a'+id);
break;
}
}
}
printf("\n");
}
int main(){
freopen("in.txt","r",stdin);
int pos=0;
T[0].init();
while(scanf("%s",ch[pos])!=EOF){
Insert(ch[pos]);
pos++;
}
for(int i=0;i<pos;i++){
printf("%s ",ch[i]);
Find(ch[i]);
}
return 0;
}