trie树--Shortest Prefixes

*传送

*题意:给出一系列相似的单词,问最少到第几位,才能完全区分他们并输出

即使看到题的时候还没有写过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 }
原文地址:https://www.cnblogs.com/very-beginning/p/13542088.html