题意:给出n个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己。
/* 字典树 在裸字典树的基础上,设置一个sum数组,sum[i]表示i这个节点被用过几次,当我们扫一个单词时, 如果它的某一个字母只用过一次,即只有它用过,那么这以前就是它的前缀。 */ #include<cstdio> #include<cstring> #include<iostream> #define N 21 #define M 1010 using namespace std; int trie[M*N][27],sum[M*N],n,tot=1; char s[M][N]; void build(int num,int rt) { int len=strlen(s[num]); for(int i=0;i<len;i++) { int x=(int)s[num][i]-'0'+1; if(!trie[rt][x])trie[rt][x]=++tot; rt=trie[rt][x]; sum[rt]++; } } void query(int num,int rt) { int len=strlen(s[num]); for(int i=0;i<len;i++) { int x=(int)s[num][i]-'0'+1; rt=trie[rt][x]; cout<<s[num][i]; if(sum[rt]==1)break; } } int main() { while(scanf("%s",s[++n])!=EOF) { build(n,1); } n--; for(int i=1;i<=n;i++) { printf("%s ",s[i]); query(i,1); printf(" "); } return 0; }