字典树+KMP

  参考自: http://www.cppblog.com/mythit/archive/2009/04/21/80633.html

  

 const int MAXN = ; //字典大小

 //定义结点
struct node{
node* fail;
node* child[MAXN];
int count;
node(){
fail = NULL;
count = ;
memset(child, NULL, sizeof(child));
}
}; //将词插入字典树
void insert(node* root, char* str){
node* p = root;
int i = ;
while(str[i]){
int index = str[i] - 'a';
if(p->child[index] == NULL) p->child[index] = new node();
p = p->child[index];
++i;
}
p->count++;
} //BFS构造失配指针/构建ACautomation
//由当前结点构造子结点失配指针
void build_acautomation(node* root){
queue<node*> q;
root->fail = NULL;
q.push(root);
while(!q.empty()){
node* temp = q.front();
node* p = NULL;
for(int i = ; i < MAXN; ++i){
if(temp->child[i] != NULL){
if(temp == root) temp->child[i]->fail = root;
else{
p = temp->fail;
while(p != NULL){
if(p->child[i] != NULL){
temp->child[i]->fail = p->child[i];
break;
}
p = p->fail;
}
if(p == NULL) temp->child[i]->fail = root;
}
q.push(temp->child[i]);
}
}
}
} //ACautomation匹配
//计算当前进行匹配的字符串及其后缀子串的个数
//count因题而异
int query(node* root){
int i = , cnt = , index;
node* p = root;
while(str[i]){
index = str[i]-'a';
while(p->child[index] == NULL && p != root) p = p->fail;
p = p->child[index];
p = (p == NULL ? root : p);
node* temp = p;
while(temp != root && temp->count != -){
cnt += temp->count;
temp->count = -;
temp = temp->fail;
}
++i;
}
return cnt;
}

  继续学习..........准备做题(VJ kuangbin AC自动机专题)

AC自动机(AC automation)的更多相关文章

  1. AC自动机(Aho-Corasick automation)模板 HDU:2222

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> us ...

  2. HDU3065【AC自动机-AC感言】

    Fourth AC zi dong ji(Aho-Corasick Automation) of life 9A(其实不止交了10发...) 感言: 一开始多组数据这种小数据还是...无伤大局,因为改 ...

  3. 浅谈算法——AC自动机

    在学习AC自动机之前,你需要两个前置知识:Trie树,KMP 首先我们需要明白,AC自动机是干什么的(用来自动AC的) 大家都知道KMP算法是求单字符串对单字符串的匹配问题的,那么多字符在单字符上匹配 ...

  4. AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)

    首先,有这样一道题: 给你一个单词W和一个文章T,问W在T中出现了几次(原题见POJ3461). OK,so easy~ HASH or KMP 轻松解决. 那么还有一道例题: 给定n个长度不超过50 ...

  5. [Alg] 文本匹配-多模匹配-AC自动机

    1. 简介 AC自动机是一种多模匹配的文本匹配算法. 如果采用naive的方法,即依次比较文本串s中是否包含模式串p1, p2,...非常耗时.考虑到这些模式串中可能具有相同子串,可以利用已经比较过的 ...

  6. 从Trie谈到AC自动机

    ZJOI的SAM让我深受打击,WJZ大神怒D陈老师之T3是SAM裸题orz...我还怎么混?暂且写篇`从Trie谈到AC自动机`骗骗经验. Trie Trie是一种好玩的数据结构.它的每个结点存的是字 ...

  7. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  8. AC自动机详解(附加可持久化AC自动机)

    AC自动机 AC自动机,说白了就是在trie树上跑kmp(其实个人感觉比kmp容易理解).是一种多匹配串,单个主串的匹配.概括来说,就是将多个匹配串构造一个trie树,对于每个trie树的节点构造nx ...

  9. T2 AC自动机

    T2:AC自动机 (ac.cpp) 题目背景 YZD在每天学习20小时的勤奋研究下,终于开发出了AC自动机!但是,这台AC自动机有一些bug,比如两个部件之间经常会出一些莫名其妙的问题,所以他想要随时 ...

随机推荐

  1. Varint code

    Varint编码   LevelDB内部通过采用变长编码,对数据进行压缩来减少存储空间,采用CRC进行数据正确性校验.下面就对varint编码进行学习. 传统的integer是以32位来表示的,存储需 ...

  2. 开始使用THREE.JS

    开始使用THREE.JS 译序 Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D.但是目前这项技术还处在发展阶段,资料极为匮乏, ...

  3. QQ空间如何显示相片

    QQ空间如何显示相片 前言 此篇文章估计不会太长,有移除首页的风险,但是老夫(称老夫是因为我们真正的叶小钗其实都100多岁啦)是不会怕滴.所以,我来了哟! 题外话:今天我们一起还看了一道前端的面试题, ...

  4. .NET对象占内存多少

    .NET对象占内存多少 一直有一个小小的疑惑——.NET一个对象或者一个集合占多少内存?有没有很快速的方法获取,而不是简单的估计分析对象大小? 查了MSDN,和一些其他人的分析,得到解决是托管代码对象 ...

  5. 压缩文件 compress files 以7z 格式及解压 或者别的格式

    主要是为了能大量的减少文件使用空间,为了能节约带宽. 那么就用了7z的压缩方式. 这里,使用了7z的压缩方式,硬生生的将一个10k多的图片压缩成了3k左右的包.图片是不好压缩的,这个压缩比比zip g ...

  6. JDBC开发

    1.JDBC简介 )数据库驱动 )Sun公司为简化数据库开发,定义了一套jdbc接口,这套接口由数据库厂商去实现,这样,开发人员只需要学习jdbc接口,并通过jdbc加载具体的驱动,就可以操作数据库. ...

  7. SQLsever2008 远程连接错误 linq

    如果你也和我一样远程连接一个sqlsever2008数据时出现类似错误 SqlException (0x80131904): 用户 ‘xxxxx' 登录失败. 首先在“服务器资源管理器”中测试一下你的 ...

  8. 异常分析:关于jsp页面使用jstl

    1.在jsp页面中使用如下代码加入jstl的支持 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/c ...

  9. Java 和 IOS 区别

    Java接口与Objective-C正式协议类似,因为都需要实现     一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但Objective-C中,可以使用文件范围内 ...

  10. api 和 abi的区别

    156down vote API: Application Program Interface This is the set of public types/variables/functions ...