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. nodejs多语句查询

    执行多条查询语句 为了安全起见,默认情况下是不允许执行多条查询语句的.要使用多条查询语句的功能,就需要在创建数据库连接的时候打开这一功能: var connection = mysql.createC ...

  2. leetcode1007

    public class Solution { public int MinDominoRotations(int[] A, int[] B) { var na = A.Length; var nb ...

  3. leetcode999

    class Solution: def numRookCaptures(self, board: 'List[List[str]]') -> int: basei = 0 basej = 0 r ...

  4. UI5-学习篇-15-云连接SAP Cloud Connector

    请关注地址:http://blog.itpub.net/29829936/viewspace-2128829/ 1.SCC下载及安装 https://tools.hana.ondemand.com/# ...

  5. es6初级之解构----之一

    1. 访问对象属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. JSP基本_JSTL

    自定义标签是,用户定义自己的处理的tag的机制. JSTL是,JSP用标准自定义标签.从JSTL Ver.1.2开始成为JavaEE5的子集.比较有名的是Glassfish.Tomcat上开发的话,需 ...

  7. JAVA_Class.forName

    Class.forName(xxx.xx.xx) 返回的是一个类 ,作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段 --------- 首先,在java里面任何class都要 ...

  8. 【358】GitHub 上面文件夹下载方法

    参考:https://www.bilibili.com/read/cv210500/ 参考:https://www.jianshu.com/p/743ecc20ffb2 软件下载:Downloads ...

  9. Windows命令行打开常用界面

    本文主要介绍Windows下命令行操作打开常用界面,使用方法为在DOS命令行下输入相关命令.可以减少多次操作界面.可以尝试在命令行执行下面提到的命令感受下,快捷键主要内容包括: 1.查看计算机的基本信 ...

  10. mac下node安装提示command not found

    官网下载了node的.pkg文件安装node,安装好后,在mac终端下输入npm -v 和 node -v均提示 command not found,参考了网上的方法,终于得解 第一步:创建.bash ...