Searching the String - ZOJ 3228(ac自动机)
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int MAXN = 6e5+;
const int MaxSon = ; char MumStr[MAXN];
int Num[MAXN], op[MAXN]; struct Ac_Trie
{
int next[MAXN][MaxSon];
int Fail[MAXN];
///End保存每个单词匹配成功后最后面的位置
///如果这个节点是一个单词,Len保存这个单词的长度
int End[MAXN], Len[MAXN];
int ans[MAXN][];///保存两种状态的答案
int root, cnt; int newnode()
{
for(int i=; i<MaxSon; i++)
next[cnt][i] = -;
Len[cnt] = Fail[cnt] = false;
End[cnt] = -;
ans[cnt][] = ans[cnt][] = ; return cnt++;
}
void InIt()
{
cnt = ;
root = newnode();
}
int Insert(char s[])
{///返回这个字符串对应的节点编号
int i, now = root; for(i=; s[i]; i++)
{
int k = s[i] - 'a'; if(next[now][k] == -)
next[now][k] = newnode();
now = next[now][k];
} Len[now] = i; return now;
}
void GetFail()
{
queue<int> Q;
int i, now = root; for(i=; i<MaxSon; i++)
{
if(next[now][i] == -)
next[now][i] = root;
else
{
Fail[next[now][i]] = root;
Q.push(next[now][i]);
}
} while(Q.size())
{
now = Q.front();
Q.pop(); for(i=; i<MaxSon; i++)
{
if(next[now][i] == -)
next[now][i] = next[Fail[now]][i];
else
{
Fail[next[now][i]] = next[Fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
void Query(char MumStr[])
{
int i, now = root, temp; for(i=; MumStr[i]; i++)
{
int k = MumStr[i] - 'a'; now = next[now][k]; if(!now)continue; temp = now; while(temp != root)
{
if(Len[temp])
ans[temp][]++;
if(Len[temp] && (i-End[temp] >= Len[temp]) )
ans[temp][]++, End[temp] = i; temp = Fail[temp];
}
}
}
};
Ac_Trie ac;
int main()
{
int i, M, t=; while(scanf("%s", MumStr) != EOF)
{
char s[];
ac.InIt(); scanf("%d", &M); for(i=; i<=M; i++)
{
scanf("%d%s", &op[i], s);
Num[i] = ac.Insert(s);
} ac.GetFail();
ac.Query(MumStr); printf("Case %d\n", t++);
for(i=; i<=M; i++)
printf("%d\n", ac.ans[Num[i]][op[i]]);
printf("\n");
} return ;
}
Searching the String - ZOJ 3228(ac自动机)的更多相关文章
- Searching the String ZOJ - 3228 AC自动机查询升级版
题意:先给你一个不超过1000000长度的大串s:接下来输入一个n代表接下来输入的小串个数,小串长度不超过6. 小串分两种类型0和1类型. 0类型表示小串在大串中的最大匹配个数就是常规的AC自动机的做 ...
- ZOJ 3494 (AC自动机+高精度数位DP)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- Detect the Virus ZOJ - 3430 AC自动机
One day, Nobita found that his computer is extremely slow. After several hours' work, he finally fou ...
- BCD Code ZOJ - 3494 AC自动机+数位DP
题意: 问A到B之间的所有整数,转换成BCD Code后, 有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000. BCD码这个在数字电路课上讲了, ...
- ZOJ - 3430 ac自动机
这题主要就是解码过程很恶心,不能用char存,一共wa了20发 题意:先给n串加密后的字符,然后m串加密后的字符,解码之后求n对应每个m的匹配数,很显然的ac自动机 加密过程是先用对应ascii表的标 ...
- ZOJ3784 String of Infinity(AC自动机&&强连通分量)
题意:给你n个禁止串,然后你只能用字符表的前m个字符去写一个无限长的串,要求是不能包含禁止串,而且串在后面不能出现循环 比赛的时候想的是先建一个自动机,然后将自动机确定化,不能到达的状态全部弄出来.但 ...
- LA 4670 Dominating Patterns (AC自动机)
题意:给定n个字符串和一个文本串,查找哪个字符串出现的次数的最多. 析:一匹配多,很明显是AC自动机.只需要对原来的进行修改一下,就可以得到这个题的答案, 计算过程中,要更新次数,并且要映射字符串.如 ...
- ZOJ 3228 Searching the String(AC自动机)
Searching the String Time Limit: 7 Seconds Memory Limit: 129872 KB Little jay really hates to d ...
随机推荐
- javascript基础学习(十)
javascript之数组 学习要点: 数组的介绍 定义数组 数组元素 数组的方法 一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组 ...
- undefined与null的区别(待修整)
没有实体的对象称为空对象.只用对象的引用,而不存在引用的实体对象 就叫做空对象 在常见的强类型语言中,通常有一个表示"空"的值,比如NULL.但是在Javascript中,空(或者 ...
- ETLLib库走读
以前从来也没想过要去看库里的代码,咱想,那怎么也是很底层的代码,居然发现库里的代码也可以这样写,那就先读懂这个ETLLib(跨windows与Linux平台,封装了一些基本的系统调用函数,然后实现定制 ...
- 织梦dedecms后台发布文章不自动更新首页与栏目列表页
dedecms发文章不自动更新首页也列表页解决办法如下: 登陆dedecms后台,找到“系统”“系统基本参数”“性能选项”,把“arclist标签调用缓存”设置成0,然后把“发布文章后马上更新网站主页 ...
- 如何用DOS 链接mysql
1.Ctrl+R 打开DOS窗口 2.键入 cd\ 回车进入C盘根目录 3.进入mysql bin目录下 操作mysql命令 4.输入连接数据库命令 mysql -hlocalhost -uroot ...
- php基础知识【函数】(7)url和ob函数
一.URl函数 1.urlencode -- 编码 URL 字符串 2.urldecode -- 解码已编码的 URL 字符串 3.rawurlencode -- 按照 RFC 1738 对 URL ...
- PHP学习之中数组-遍历一维数组【2】
在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...
- openerp binary filed import export
1: user xmlrpc 2: use csv file to export import but want to change the csv model field_size_limit
- 尽量使用ToUpper比较,避免使用ToLower
在编码时尽量使用ToUpper比较,避免使用ToLower,因为微软对ToUpper进行了优化,以下为测试结果: public void TestToLower() { Stopwatch watch ...
- Spring Framework Reference,Documentation,spring英文文档.pdf 官方文档
直接上链接:http://files.cnblogs.com/files/kongkaikai/spring-framework-reference.pdf 官网链接:http://docs.spri ...