*题意:给出一系列相似的单词,问最少到第几位,才能完全区分他们并输出
即使看到题的时候还没有写过trie树,但是第一反应就是,trie树记录每一位有多少单词经过,到等于1恰好截止
trie树流程:trie树分为建树和查找,建树一般没什么区别,从0开始为根节点,如果当前节点的子节点没有想要的字符,就多加一支,为了方便我们可以把字符转换成int型s[i]-'a',一般情况下还得记录终止节点。当然本题还需要记录一下每个节点经过的次数
搜查的时候,如果vis一直>1就添加继续向下找,如果=1,添加后返回
代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 #include <cstring>
5 using namespace std;
6 char s[25000][50];
7 int vis[25000],trie[25000][50],cnt=0;
8 void build(char *c){
9 int root=0,len=strlen(c);
10 for (int i = 0;i < len;i++){
11 //cout<<1<<endl;
12 int next=c[i]-'a';
13 if (!trie[root][next])trie[root][next]=++cnt;
14 root=trie[root][next];
15 vis[root]++;
16 }
17 }
18 string query(char *c){
19 string ans;
20 int root=0,len=strlen(c);
21 for(int i = 0;i < len;i++){
22 if(vis[root]==1)
23 return ans;
24 int next=c[i]-'a';
25 ans+=c[i];
26 root=trie[root][next];
27 }
28 return ans;
29 }
30 int main(){
31 int n=0;
32 while (scanf ("%s",s[n])!=EOF){
33 build(s[n]);n++;
34 }
35 for (int i = 0;i <n;i++) cout<<s[i]<<" "<<query(s[i])<<endl;
36 return 0;
37 }