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自动机模板的更多相关文章

  1. HDU:2222-Keywords Search(AC自动机模板,匹配模拟)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...

  2. KMP,Trie,AC自动机题目集

    字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的.字符串的题目灵活多变也有许多套路,需要多做题才能体会.这里收集了许多前辈的题目做个集合,方便自己回忆. KMP题目:https:// ...

  3. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  4. Match:Keywords Search(AC自动机模板)(HDU 2222)

    多模匹配 题目大意:给定很多个字串A,B,C,D,E....,然后再给你目标串str字串,看目标串中出现多少个给定的字串. 经典AC自动机模板题,不多说. #include <iostream& ...

  5. HDU 3065 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3065 题目大意:多个模式串,范围是大写字母.匹配串的字符范围是(0~127).问匹配串中含有哪几种模 ...

  6. HDU 2896 (AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2896 题目大意:多个模式串.多个匹配串.其中串的字符范围是(0~127).问匹配串中含有哪几个模式串 ...

  7. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  8. HDU 2222 (AC自动机模板题)

    题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...

  9. hdu 2222 Keywords Search ac自动机模板

    题目链接 先整理一发ac自动机模板.. #include <iostream> #include <vector> #include <cstdio> #inclu ...

随机推荐

  1. api文档管理系统合集

    1.Swagger 2.Showdoc 3.EOAPI 4.阿里的RAP 5.postMan 6.docute: 无需编译的文档撰写工具 7.SmartWiki 接口文档在线管理系统 8.SosoAp ...

  2. web前端全栈学习之路

    web前端全栈学习之路 --- 陆续更新中 一.HTML相关 1.HTML常用标签:http://www.cnblogs.com/wyb666/p/8733699.html 2.HTML5基础: 3. ...

  3. Redis实现分布式锁原理与实现分析

    一.关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到. 我举二个例子: 场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能在某一个时刻会有二笔一样的单子同时到达系统后台. ...

  4. 使用Inent 携带 Bundle 携带 数组 传递给另外一个activity

    在activity发送数组: public static String [] PhoneAndTime = new String[2]; //new 新的Intent Intent data = ne ...

  5. Oracle 日志归档 自动清理

    exp emis/emis@orcl file=d:\backup\oracle\oracle%date:~0,10%.dmp owner=emis log=d:\backup\oracle\orac ...

  6. ajax 406 Not Acceptable

    搞了半天, 后面参照 http://www.th7.cn/web/ajax/201611/194702.shtml, 终于把问题解决了.. 使用ajax向后台请求时,前台报错406 Not Accep ...

  7. 图片 base64转byte[]

    /// <summary> /// 保存base64图片,返回阿里云地址 /// </summary> /// <param name="imgCode&quo ...

  8. GridView Bind 短日期 格式

    ASP.NET的GridView控件的编辑模板中,需要绑定数据库中的某个字段,如<%# Bind("startTime","{0:d}") %> 在 ...

  9. 如何创建一个django工程与和mysql打通

    1. 安装Django # 在指定解释器环境下安装django 1.11.x # 在真实python3环境下: pip3 install django==1.11.x # 查看django版本: dj ...

  10. JS与Android交互

    一.Android调用JS 2种方法 1.通过WebView的loadUrl 2.通过WebView的evaluateJavascript