题目大意:
n个字符串,求它们与其他字符串不同的最短前缀,如果这个字符串是其他字符串的前缀,输出它本身
思路:
字典树
字典树存一下,看什么时候该节点只有一个串了就好了
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; char wd[1010][25]; int t,cnt,tr[301010][30],s[301010]; void insert(int i) { int len=strlen(wd[i]),k,pos=0; for(int j=0;j<len;j++) { k=wd[i][j]-'a'; if(tr[pos][k]==0) tr[pos][k]=++t; pos=tr[pos][k]; s[pos]++; } } void ask(int i) { int len=strlen(wd[i]),k,pos=0; printf("%s ",wd[i]); for(int j=0;j<len;j++) { if(s[pos]==1) break; k=wd[i][j]-'a'; printf("%c",wd[i][j]); pos=tr[pos][k]; } } int main() { while(scanf("%s",wd[cnt++])!=EOF) insert(cnt-1); for(int i=0;i<cnt;i++) { ask(i);printf(" "); } }