POJ2001 Shortest Prefixes(字典树)
题意:给出n个单词(1<=n<=1000),求出每个单词的非公共前缀,如果没有,则输出自己。
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<stack> #include<cmath> #include<queue> #include<map> using namespace std; struct Node { int c; int next[26]; } node[20005]; int cnt; int newnode() { ++cnt; node[cnt].c=0; for(int i=0; i<26; i++) node[cnt].next[i]=-1; return cnt; } char s[1006][25]; int len[1006]; void insert(int rt,int tt,int now) { if(now>len[tt])return; int p=s[tt][now]-'a'; if(node[rt].next[p]==-1) { int l=newnode(); node[rt].next[p]=l; node[l].c+=1; insert(l,tt,now+1); } else { int l=node[rt].next[p]; node[l].c+=1; insert(l,tt,now+1); } } void print(int rt,int tt,int now) { if(now>len[tt])return; printf("%c",s[tt][now]); if(node[rt].c==1)return; int p=s[tt][now+1]-'a'; print(node[rt].next[p],tt,now+1); } int main() { int k=0; cnt=0; node[0].c=0; for(int i=0;i<26;i++) node[0].next[i]=-1; while(~scanf("%s",s[++k]+1)) { len[k]=strlen(s[k]+1); insert(0,k,1); } for(int i=1;i<=k;++i) { printf("%s ",s[i]+1); int p=s[i][1]-'a'; print(node[0].next[p],i,1); printf("\n"); } return 0; }