题目大意:求最短唯一前缀
题解:Trie树 把单词一个个插入,每个字母节点v[]++;然后输出时输出到v[]为1的点,
v[]=1说明只有这个单词经过。
代码 :
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 100009 using namespace std; int n,cnt; int trie[N*30][30],v[N]; char s[N][30]; void insert(int x) { int root=0,len=strlen(s[x]); for(int i=0;i<len;i++) { int id=s[x][i]-'a'; if(trie[root][id]==0) trie[root][id]=++cnt; root=trie[root][id]; v[root]++; } } void find(int x) { cout<<s[x]<<" "; int root=0,len=strlen(s[x]); for(int i=0;i<len;i++) { int id=s[x][i]-'a'; //cout<<"---"<<trie[root][id]<<endl; if(v[root]==1) break; cout<<s[x][i]; root=trie[root][id]; } printf("\n"); } int main() { while(scanf("%s",s[++n])!=EOF){insert(n);} for(int i=1;i<=n;i++) find(i); return 0; }