方法就是维护一个动态栈 记录栈的每一位匹配到串的哪一位的编号 第一道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++计算器项目的初始部分(第三次作业)

    C++计算器项目的初始部分 项目源文件地址:calculator 项目信息: * 项目名称:Calculator * 项目实现: * 对四则运算表达式进行拆解 * 对拆解的表达式进行简单的错误判断 * ...

  2. <Effective C++>读书摘要--Implementations<二>

    <Item29> Strive for exception-safe code. 1.如下面的代码 class PrettyMenu { public: ... void changeBa ...

  3. css那些事儿3 列表与浮动

    一  列表 列表默认为行内块元素,具有宽高,当一个非块元素是无法应用宽高的,比如a 1 有序列表 有ol li组成,其中li为列表项,列表的ol子元素务必为li元素标签,li子内容支持列表任意嵌套,有 ...

  4. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

  5. lol人物模型提取(五)

      修改了发过去后,那边说吊坠的绳子太细了,厚度至少1mm,推荐是2mm,需要我自己加粗,没办法又得用3ds max一根一根线地缩放了.   修改好后问报价,高精度树脂打印需要730元,还不带上色的, ...

  6. OO的五大原则

    OO的五大原则是指SRP.OCP.LSP.DIP.ISP 1. SRP(Single Responsibility Principle 单一职责原则) 单一职责很容易理解,所谓单一职责,就是一个设计元 ...

  7. PL/SQL在 win8.1系统下连接Oracle11g没有database处理方法(亲身实验,吐血分享)

    一.问题 这里首先说明下我的环境:win8.1(64bit)+oracle11g(64bit)+PL/SQL(32bit).状况是:net manager正常配置,测试也成功,但是用PL/SQL连接的 ...

  8. BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)

    dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...

  9. [洛谷P5068][Ynoi2015]我回来了

    题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...

  10. CF916E Jamie and Tree 解题报告

    CF916E Jamie and Tree 题意翻译 有一棵\(n\)个节点的有根树,标号为\(1-n\),你需要维护一下三种操作 1.给定一个点\(v\),将整颗树的根变为\(v\) 2.给定两个点 ...