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 ...
随机推荐
- JVM总结-java内存模型
我们先来看一个反常识的例子. int a=0, b=0; public void method1() { int r2 = a; b = 1; } public void method2() { in ...
- mac中svn服务器的搭建以及如何在eclipse中使用
mac自带了svn客户端和服务端功能. 1.查看svn版本 svnserve --version yintingtingdeMacBook-Pro:~ yintingting$ svnserve -- ...
- python - 配置文件
#配置文件 #.ini .properties .conf 等都是配置文件 #section 片段[]: option 选项 #同一个section下option都是唯一的 #语法 #[secion] ...
- 2、申请苹果App ID
在“iOS Certificates”页面“Identifiers"下选择“App IDs",可查看到已申请的所有App ID,点击右上角的加号可创建新“App ID”:打开“Re ...
- JAVA 操作mysql 存储 调用
HashMap map = new HashMap(); map.put("a", 9); map.put("b", ""); List&l ...
- C语言学习一个月后感想
C语言学习一个月后感想 感谢李晓东老板及计算机工程师联盟的学长学姐和某神秘同级同学的辛勤指导,感谢宋雨田的督促和陪伴. 初识C的1..体会 我本以为凭借瓜皮思维和花里胡哨操作可以让我熟练地学习语言,现 ...
- nginx 服务器 在 centos7 系统下的两种方式
选用系统 Centos7 < 一 > 使用 yum 安装,该方法比较方便,如果不追求版本推荐使用 01, 添加 nginx 储存库 yum -y install epel-releas ...
- kubernets之endpoints
注:本文整理自网络 endpoint endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址.service配置selector,endp ...
- leetcode989
class Solution: def addToArrayForm(self, A, K): i = len(A) - 1 while i >= 0 and K > 0: A[i] += ...
- react-navigation,StackNavigator,TabNavigator 导航使用
StackNavigator 参考这里 TabNavigator 参考这里 是一个组合,我把这2个写在一起了 代码: import React, { Component } from 'react ...