此题运用字典树,只要再给字典树加一个计算个数的变量,然后再依次遍历每个字符串,等到此字符串的某个字母的计数个数为1或者是此字符串的长度到头了,即可停止输出了。字典树的关键还是插入操作。代码见下:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX_N 1000000
using namespace std;
struct k{
int next;
int cnt;
}trie[MAX_N][27];
char s[1010][30];
int now=0;
void insert(char s[]){
int len=strlen(s);
int root = 0;
for(int i=0;i<len;++i){
if(!trie[root][s[i]-97].cnt){
trie[root][s[i]-97].cnt++;
trie[root][s[i]-97].next=++now;
root = now;
}
else{
trie[root][s[i]-97].cnt++;
root = trie[root][s[i]-97].next;
}
}
}
int main(){
int n=0;
while(~scanf("%s",s[n++])){
insert(s[n-1]);
}
for(int i=0;i<n;++i){
printf("%s ",s[i]);
int root=0,len=strlen(s[i]),j=0;
while(trie[root][s[i][j]-97].cnt!=1 && j<len){
printf("%c",s[i][j]);
root=trie[root][s[i][j++]-97].next;
}
if(j<len)
printf("%c\n",s[i][j]);
else
printf("\n");
}
}