KMP与AC自动机模板
HDU 1711 Number Sequence(KMP模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1711
#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e6+;
typedef long long LL;
typedef unsigned long long ULL;
//typedef pair<LL,LL> P;
const LL mod=1e9+;
using namespace std;
int a[maxn],b[maxn],Next[maxn];
int n,m;
void get_next(){
Next[]=-;
int k=-,i=;
while(i<m){
while(k>-&&b[k]!=b[i]){
k=Next[k];
}
if(b[k]==b[i]||k==-){
k++;
}
Next[++i]=k;
}
return;
}
int main(){
fio;
int t;
cin>>t;
while(t--){
cin>>n>>m;
for(int i=;i<n;i++){
cin>>a[i];
}
for(int i=;i<m;i++){
cin>>b[i];
}
get_next();
int p=;
int is=-;
for(int i=;i<n;){
if(a[i]==b[p]||p==-){
p++;
i++;
}
else{
while(p!=-){
if(b[p]==a[i]){
break;
}
p=Next[p]; }
}
if(p==m){
is=i-m+;
break;
}
}
cout<<is<<endl;
}
}
HDU 2222 Keywords Search(AC自动机模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2222
#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e6+;
typedef long long LL;
typedef unsigned long long ULL;
//typedef pair<LL,LL> P;
const LL mod=1e9+;
using namespace std;
struct node{
node *nxt[];
node *fail;
int is;
void init(){
is=;
fail=;
NEW(nxt,);
}
};
node *root;
node *q[maxn];
int cnt;
void Insert(string s){
node *p=root;
int x;
for(int i=;s[i];i++){
x=s[i]-'a';
if(p->nxt[x]==NULL){
p->nxt[x]=new node;
p->nxt[x]->init();
}
p=p->nxt[x];
}
p->is++;
}
void build_failpoint(){
int head=;
int tail=;
q[]=root;
node *tmp;
node *f;
while(head<tail){
tmp=q[head++];
for(int i=;i<;i++){
if(tmp->nxt[i]){
if(tmp==root){
tmp->nxt[i]->fail=root;
}
else{
f=tmp->fail;
while(f!=){
if(f->nxt[i]!=){
tmp->nxt[i]->fail=f->nxt[i];
break;
}
f=f->fail;
}
if(f==){
tmp->nxt[i]->fail=root;
}
}
q[tail++]=tmp->nxt[i];
}
}
}
}
void ac_automation(string t){
node *p=root;
int x;
for(int i=;t[i];i++){
x=t[i]-'a';
if(p->nxt[x]){
p=p->nxt[x];
}
else{
p=p->fail;
while(p!=){
if(p->nxt[x]){
p=p->nxt[x];
break;
}
p=p->fail;
}
if(p==){
p=root;
}
}
node *tmp=p;
while(tmp->is!=-&&tmp!=root){
cnt+=tmp->is;
tmp->is=-;
tmp=tmp->fail;
}
}
}
int main(){
fio;
int t;
int n;
cin>>t;
string s;
while(t--){
cin>>n;
cnt=;
root=new node;
root->init();
for(int i=;i<n;i++){
cin>>s;
Insert(s);
}
build_failpoint();
cin>>s;
ac_automation(s);
cout<<cnt<<endl;
}
}
AC自动机改成了数组版(表示作为下标党用不惯指针)
#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e6+;
typedef long long LL;
typedef unsigned long long ULL;
//typedef pair<LL,LL> P;
const LL mod=1e9+;
using namespace std;
struct node{
int nxt[];
int fail;
int is;
void init(){
is=;
fail=;
NEW(nxt,);
}
}q[maxn];
int root=,tot=;
int cnt,que[maxn];
void Insert(string s){
int p=root;
int x;
for(int i=;s[i];i++){
x=s[i]-'a';
if(q[p].nxt[x]==){
q[p].nxt[x]=++tot;
q[q[p].nxt[x]].init();
}
p=q[p].nxt[x];
}
q[p].is++;
}
void build_failpoint(){
int head=;
int tail=;
que[]=root;
int tmp;
int f;
while(head<tail){
tmp=que[head++];
for(int i=;i<;i++){
if(q[tmp].nxt[i]){
if(tmp==root){
q[q[tmp].nxt[i]].fail=root;
}
else{
f=q[tmp].fail;
while(f!=){
if(q[f].nxt[i]!=){
q[q[tmp].nxt[i]].fail=q[f].nxt[i];
break;
}
f=q[f].fail;
}
if(f==){
q[q[tmp].nxt[i]].fail=root;
}
}
que[tail++]=q[tmp].nxt[i];
}
}
}
}
void ac_automation(string t){
int p=root;
int x;
for(int i=;t[i];i++){
x=t[i]-'a';
if(q[p].nxt[x]){
p=q[p].nxt[x];
}
else{
p=q[p].fail;
while(p!=){
if(q[p].nxt[x]){
p=q[p].nxt[x];
break;
}
p=q[p].fail;
}
if(p==){
p=root;
}
}
int tmp=p;
while(q[tmp].is!=-&&tmp!=root){
cnt+=q[tmp].is;
q[tmp].is=-;
tmp=q[tmp].fail;
}
}
}
int main(){
fio;
int t;
int n;
cin>>t;
string s;
while(t--){
cin>>n;
cnt=;
q[root].init();
for(int i=;i<n;i++){
cin>>s;
Insert(s);
}
build_failpoint();
cin>>s;
ac_automation(s);
cout<<cnt<<endl;
}
}
KMP与AC自动机模板的更多相关文章
- HDU:2222-Keywords Search(AC自动机模板,匹配模拟)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...
- KMP,Trie,AC自动机题目集
字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的.字符串的题目灵活多变也有许多套路,需要多做题才能体会.这里收集了许多前辈的题目做个集合,方便自己回忆. KMP题目:https:// ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- Match:Keywords Search(AC自动机模板)(HDU 2222)
多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...
- HDU 3065 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...
- HDU 2896 (AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- HDU 2222 (AC自动机模板题)
题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...
- hdu 2222 Keywords Search ac自动机模板
题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...
随机推荐
- iOS第三方登录qq
http://blog.sina.com.cn/s/blog_7b9d64af0101e5vj.html
- SAP生产机该不该开放Debuger权限(转)
前段时间公司定制系统在调用SAP RFC接口的时候报错了,看错误消息一时半会儿也不知道是哪里参数数据错误,就想着进到SAP系统里面对这个接口做远程Debuger,跟踪一下参数变量的变化,结果发现根本就 ...
- 《算法》第四章部分程序 part 18
▶ 书中第四章部分程序,包括在加上自己补充的代码,在有权有向图中寻找环,Bellman - Ford 算法求最短路径,套汇算法 ● 在有权有向图中寻找环 package package01; impo ...
- python中的expandtabs、\t
expandtabs()将tab转换成空格,默认1个tab转成8个空格,\t制表符代表一个tab,我们也可以自定义转换成几个空格 举个例子: 1 a = "hello\tworld" ...
- python中的extend
extend()拓展列表,批量写入 举个例子: 1 a = ["hello", "world", "dlrb"] 2 b = [1, 2, ...
- vmware使用vsphere的镜像
vsphere镜像导出后可以使用vmware station打开, vsphere镜像导出时需要关机,否则会提示失败,有文件不能导出.
- DataBinding(二):DataBinding的基本用法
转自:DataBinding系列(二):DataBinding的基本用法 1.在xml中引入一些基础变量Variables data 标签中可以有任意数量的 variable 标签.这些变量可以使Ja ...
- java数组实现队列
数组队列 用数组实现的队列,也叫循环队列.就是定义一个数组,用两个下标head,tail表示队头和队尾.当队头和队尾相等时,队列为空.当队尾+1等于队头时,队列为满. 注意tail的值,当插入一个元素 ...
- [记录] Linux Apache隐藏index.php
1. 在项目更目录下新建 .htaccess <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEng ...
- usb之python(pyusb)
电脑系统为WIN7 64位 python:为python3.6 32位 需要插件PyUSB-1.0.0.tar,pywinusb-0.4.2. 按照的步骤我偷懒了,自己百度一下. 我们先看设备管理的 ...