首先说下字典树给来干嘛的;
字典树建立是把单词按前缀建立的,这样遍历或者比较都可以根据前缀来判断 少了不必要的操作,其实以前用set容器对单词去重的时候就考虑过这个办法,但能力有限实现不了
今天才知道原来这个就叫字典树
题目描述给你一些单词,然后在给你一个单词询问前缀能与此单词匹配的单词有多少;
分析:模板,KMP是处理单一的模式匹配 而字典树可以处理多个模式串匹配
注意:1是怎么处理不同树上相同的节点(++tot),可以看成是hash;
            2 记录每个终点的值;
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=2e6;
int tot;
int sum[MAX]={0};
int tree[MAX][30]={0};
void insert_(char * str){//模板部分
    int root=0,len=strlen(str);
    for(int i=0;i<len;i++){
        int id=str[i]-'a';
        if(!tree[root][id])tree[root][id]=++tot;
        sum[tree[root][id]]++;
        root=tree[root][id];
    }
}
int find_(char*str){
    int root=0,len=strlen(str);
    for(int i=0;i<len;i++){
        int id=str[i]-'a';
        if(!tree[root][id])return 0;
        root=tree[root][id];
    }
    return sum[root];
}
char s[MAX];
int main(){
    tot=0;
    while(gets(s)&&s[0]!=0){
        insert_(s);
    }
    while(cin>>s){
        cout<<find_(s)<<endl;
    }
}