方法就是维护一个动态栈 记录栈的每一位匹配到串的哪一位的编号 第一道kmp第二道ac自动机 自己理会
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
char stack[M],s[M],t[M],f[M],next[M];
int len,top;
void getfail(){
for(int i=;i<len;i++){
int j=f[i];
while(j&&t[i]!=t[j]) j=f[j];
f[i+]=(t[i]==t[j]?j+:);
}
}
int main()
{
scanf("%s %s",s,t);
int L=strlen(s); len=strlen(t); getfail();
for(int i=;i<L;i++){
stack[++top]=s[i];
int j=next[top-];
while(j&&t[j]!=stack[top]) j=f[j];
if(t[j]==stack[top]) j++;
next[top]=j;
if(j==len) top-=len;
}
for(int i=;i<=top;i++) printf("%c",stack[i]);
return ;
}
//同bzoj3942
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int size=,M=;
char s[M],T[M],stack[M];
int next[M],top,n;
struct node{
int sum,a[M][],last[M],fail[M],val[M];
int id(char s) {return s-'a'+;}
void insert(char s[]){
int k=,L=strlen(s);
for(int i=;i<L;i++){
int now=id(s[i]);
if(!a[k][now]) a[k][now]=++sum;
k=a[k][now];
}
val[k]=L;
}
void getfail(){
int q[M],k=,head=,tail=;
for(int i=;i<=;i++){
int now=a[][i];
if(now) q[tail++]=now;
}
while(head!=tail){
int x=q[head++];
for(int i=;i<=;i++){
int now=a[x][i];
if(!now) { a[x][i]=a[fail[x]][i];continue;}
q[tail++]=now;
fail[now]=a[fail[x]][i];
last[now]=val[fail[now]]?fail[now]:last[fail[now]];
}
}
}
void Ac_boy(){
int now=,L=strlen(T);
for(int i=;i<L;i++){
int d=id(T[i]);
stack[top]=T[i];
now=a[now][d];
next[top]=now;
if(val[now]) top-=val[now],now=next[top];
else if(last[now]) top-=val[last[now]],now=next[top];
top++;
}
}
}node;
int main()
{
scanf("%s",T);
int n; scanf("%d",&n);
while(n--) scanf("%s",s),node.insert(s);
node.getfail(); node.Ac_boy();
for(int i=;i<top;i++) putchar(stack[i]);
return ;
}

bzoj3940&&bzoj3942 Ac自动机||kpm算法的更多相关文章

  1. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

  2. 算法总结篇---AC自动机

    目录 写在前面 算法流程 引例: 概述: Trie树的构建(第一步) 失配指针(第二步) 构建失配指针 字典树和字典图 多模式匹配 例题 写在前面 鸣谢: OiWiki 「笔记」AC 自动机---Lu ...

  3. hihocoder第218周:AC自动机

    题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例 ...

  4. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

  5. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  6. AC自动机算法详解

    首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章, ...

  7. AC自动机——多模式串匹配的算法思想

    标准KMP算法用于单一模式串的匹配,即在母串中寻求一个模式串的匹配,但是现在又存在这样的一个问题,如果同时给出多个模式串,要求找到这一系列模式串在母串存在的匹配个数,我们应该如何处理呢? 基于KMP算 ...

  8. 经典算法题每日演练——第八题 AC自动机

    原文:经典算法题每日演练--第八题 AC自动机 上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那 ...

  9. 算法模板——AC自动机

    实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...

随机推荐

  1. 阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...

  2. tabales1.10版参数详解

    //@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...

  3. Alpha 冲刺报告(3/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:开始编写角色的移动脚本 明日计划:继续学习并进行脚本编写 剩余任务:物品背包交互代码 困难:如何把各个模块的脚本整合起来 --------- ...

  4. 《Debian标准教程》摘录2则

    1.克隆Debian系统 如果使用的Debian系统只有使用apt安装的软件包,可以使用下面的脚本来安装一个完全一样的新系统. #在源主机上 dpkg --get-selections > se ...

  5. noauth authentication required redis

    解决方案: 这是出现了认证的问题,是因为设置了认证密码. 127.0.0.1:6379> auth "yourpassword" 例如:

  6. 原生js移动端字体自适应方案

    自从进入新公司之后,就一直采用800的方案,也就是判断屏幕尺寸,大于800px是一种html字体处理方案,另一种方案是小于800px的html字体处理方案, 代码如下: (function(doc, ...

  7. hadoop fs 部分命令详解

    1,Hadoop fs –fs [local | <file system URI>]:声明hadoop使用的文件系统,如果不声明的话,使用当前配置文件配置的,按如下顺序查找:hadoop ...

  8. [C/C++] 字符串错题集

    1. 答案:A 这里考查转义字符,注意 \\ 表示字符 \\123表示字符 {\t 表示制表符这些都是一个字符. 2. 答案C 先不看有没有重复的,共5个字母,有5×4×3×2×1 = 120种组合. ...

  9. VisualVM使用方法

    VisualVM 简介 VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序( ...

  10. css3 字体渐变

    先看个效果 https://www.bienvillecapital.com/ 然后人家样式这样写的 font-family: Overpass,Helvetica,sans-serif; font- ...