标签:
今天就这题照着别人的代码学了字典树...
这篇论文:http://wenku.baidu.com/view/d2ba836fb84ae45c3b358ca8.html介绍了各种字典树的运用,长了好多姿势,很有启发性
归纳一下字典树的应用:
检索(主要功能)
串排序
在DP中减少无效的状态转移
最长公共前缀问题(LCP)转化成LCA
tire+KMP 构成AC自动机数据结构
//93MS 44636K
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct trie{
int cnt;
trie *child[26];
trie(){ // 构造函数
cnt=0;
memset(child,0,sizeof(child));
}
};
trie *root=new trie; //new比malloc方便
trie *current,*newnode;
void Insert(char *str){
current=root;
for(int i=0;str[i];i++){
int m=str[i]-'a';
if(current->child[m]!=NULL){
current=current->child[m];
current->cnt++;
}
else {
newnode=new trie;
newnode->cnt++;
current->child[m]=newnode;
current=newnode;
}
}
}
int Find(char *str){
current=root;
for(int i=0;str[i];i++){
int m=str[i]-'a';
if(current->child[m]){
current=current->child[m];
}
else return 0;
}
return current->cnt;
}
int main(){
char tmp[20];
while(gets(tmp),strcmp(tmp,"")){
Insert(tmp);
}
while(gets(tmp)!=NULL){
printf("%d\n",Find(tmp));
}
return 0;
}标签:
原文地址:http://blog.csdn.net/kalilili/article/details/43973101