简单版

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
using namespace std;
const int MAXN=1000005;
int n;
char s[MAXN];
struct ACAM{
int nxt[MAXN][26],end[MAXN],fail[MAXN],nume;
ACAM(){
memset(nxt,0,sizeof(nxt));
memset(end,0,sizeof(end));
memset(fail,0,sizeof(fail));
nume=0;
}
void ins(char s[]){
int len=strlen(s);
int p=0;
for(int i=0;i<len;i++){
int v=s[i]-'a';
if(!nxt[p][v]) nxt[p][v]=++nume;
p=nxt[p][v];
}
end[p]++;
}
void getfail(){
queue <int>q;
for(int i=0;i<26;i++) if(nxt[0][i]) fail[nxt[0][i]]=0,q.push(nxt[0][i]);
int p=0;
while(!q.empty()){
p=q.front();q.pop();
for(int i=0;i<26;i++){
if(nxt[p][i]) fail[nxt[p][i]]=nxt[fail[p]][i],q.push(nxt[p][i]);
else nxt[p][i]=nxt[fail[p]][i];
}
}
}
int query(char s[]){
int len=strlen(s);
int p=0,ans=0;
for(int i=0;i<len;i++){
p=nxt[p][s[i]-'a']; //注意这里是s[i]-'a'
for(int k=p;k&&(~end[k]);k=fail[k]) ans+=end[k],end[k]=-1;
}
return ans;
}
}AC;
int main(){
freopen("in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) scanf("%s",s),AC.ins(s);
AC.getfail();
scanf("%s",s);int ans=AC.query(s);
printf("%d\n",ans);
fclose(stdin);
return 0;
}

增强版

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#define RST(a) memset((a),0,sizeof((a)))
using namespace std;
const int MAXN=1e6+10,MAXM=152*72;
int n;
char s[152][72],t[MAXN];
struct ACAM{
int nxt[MAXM][26],fail[MAXM],end[MAXM],nume,cnt[MAXM],lst[MAXN];
bool f[MAXM];
void clear(){
RST(nxt);RST(fail),RST(end),RST(cnt);nume=0;RST(lst);
}
void ins(char s[],int index){
int len=strlen(s);
int p=0;
for(int i=0;i<len;i++){
int v=s[i]-'a';
if(!nxt[p][v]) nxt[p][v]=++nume;
p=nxt[p][v];
}
end[p]=index;
}
void getfail(){
queue <int> q;
for(int i=0;i<26;i++) if(nxt[0][i]) fail[nxt[0][i]]=0,q.push(nxt[0][i]);
int p=0;
while(!q.empty()){
p=q.front(),q.pop();
for(int i=0;i<26;i++){
int v=nxt[p][i];
if(v) {
fail[v]=nxt[fail[p]][i],q.push(v);
lst[v]=end[fail[v]]?fail[v]:lst[fail[v]];
}
else nxt[p][i]=nxt[fail[p]][i];
}
}
}
int query(char t[]){
int len=strlen(t);
int p=0;
for(int i=0;i<len;i++){
p=nxt[p][t[i]-'a'];
if(end[p]) cnt[end[p]]++;
for(int k=lst[p];k;k=lst[k]) cnt[end[k]]++;
}
int res=0;
for(int i=1;i<=n;i++) res=max(res,cnt[i]);
printf("%d\n",res);
for(int i=1;i<=n;i++) if(cnt[i]==res) printf("%s\n",s[i]);
}
}AC;
int main(){
freopen("in.txt","r",stdin);
scanf("%d",&n);
while(n){
AC.clear();
for(int i=1;i<=n;i++){
scanf("%s",s[i]);//cout<<s[i]<<endl;
AC.ins(s[i],i);
}
AC.getfail();
scanf("%s",t);
AC.query(t);
scanf("%d",&n);
}
fclose(stdin);
return 0;
}

AC 自动机 模板的更多相关文章

  1. HDU 2222 AC自动机模板题

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. KMP与AC自动机模板

    HDU 1711 Number Sequence(KMP模板题) http://acm.hdu.edu.cn/showproblem.php?pid=1711 #include<bits/std ...

  9. HDU3695(AC自动机模板题)

    题意:给你n个字符串,再给你一个大的字符串A,问你着n个字符串在正的A和反的A里出现多少个? 其实就是AC自动机模板题啊( ╯□╰ ) 正着query一次再反着query一次就好了 /* gyt Li ...

  10. POJ2222 Keywords Search AC自动机模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...

随机推荐

  1. C/C++之循环结构

    C语言中提供四种循环,即goto循环.while循环.do…while循环和for循环.四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经 ...

  2. [国嵌笔记][029][ARM处理器启动流程分析v2]

    2440启动流程 启动方式:nor flash启动.nand flash启动 地址布局: 选择nor flash启动时,SROM(nor flash)地址为0x00000000 选择nand flas ...

  3. js keys方法和foreach方法区别

    keys和foreach都有遍历对象的功能,但他们可以遍历的对象类型是不一样的,foreach是数组对象的方法,而keys是Object对象的方法.换句话说,foreach只能数组对象使用,而keys ...

  4. sql for xml 输出结果带单引号出现转成&apos的解决方案

    select '''' + ID +''',' from  表 for xml path('') 此SQL语句,输出结果如‘1’,’2‘,’3‘, 但是在因xml会出现path转译的问题将‘转成&am ...

  5. Java学习笔记22---内部类之成员内部类的继承问题

    成员内部类可以继承其他的类,也可以被其它类继承,本文主要说明其它类继承成员内部类的问题. 本文要点如下: 1).成员内部类的子类可以是内部类,也可以不是内部类: 2).当成员内部类的子类不是内部类或子 ...

  6. 机器学习——kNN(2)示例:改进约会网站的配对效果

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  7. web前端学习(2):开始编写HTML

    在第一章中,我们初步了解了上网的过程,同时也明白了所谓网页,其本质就是主要用HTML语言所写的一份文档.相信大多数人在了解HTML文件前,最先接触的是利用"记事本"所写的文档或者是 ...

  8. Appium移动自动化测试之—基于java的iOS环境搭建

    本文仅供参考,同时感谢帮助我搭建环境的同事 操作系统的名称:Mac OS X操作系统的版本:10.12.6 接下来我们开始踏上搭建Appium+java+ios之路,本文只说个大概,毕竟本机已经装过了 ...

  9. Python-Blog2-编写Web app 骨架

    撸代码之前让我们先来看几个概念: 什么是协程(Coroutine)? 假设现在有两个子程序,子程序A和子程序B: def A(): print('1') print('2') print('3') d ...

  10. junit源码解析--核心类

    JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架.它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUnit ...