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 ...
随机推荐
- OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
1.安装Homebrew,执行命令 1 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- 关于CenttOS的防火墙问题
Fix “Unit iptables.service failed to load: No such file or directory” Error In CentOS7 最近在升级CentOS7遇 ...
- js事件练习--登录界面演示。
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jsonp是什么以及jsonp的使用
1概述 Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料.由于同源策略,一般来说位于 server1.example.com 的网 ...
- [前端笔记]第三篇:JavaScript
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.代码存放位置 J ...
- 开发DZ插件教程
插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深 ...
- 取消开机window 设备选择
问题:开机,出现window 设备选择,在win7 页面上会停留几秒.解决方案:win+R 输入 -msconfig 进入引导 把延迟改为3
- c++:参数型别的推导
STL源码剖析--侯捷 总结 尽管现在的很多语言支持参数类型的判别,但是c/c++并不支持这一特性. 但是我们可以通过一些技巧使得c++具有自动判别参数类型的特性. 模板 我们都知道在模板类和模板函数 ...
- frameset iframe用来分页
frameset用来分大的框架 iframe用来在frame分框架之后,内嵌分割. <FRAMESET border=1 frameSpacing=1 borderColor=#47478d r ...
- oracle timestamp的转换
select to_char(stime,'yyyy-mm-dd HH24:MI:ss.ff3') from e_bmp_log_operation t where t.sdetail like '% ...