首先说下字典树给来干嘛的;
字典树建立是把单词按前缀建立的,这样遍历或者比较都可以根据前缀来判断 少了不必要的操作,其实以前用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; } }