从原来的单串匹配变成了多串匹配

好像也没什么特别不一样的地方

原来的做法是搞一个栈,之后一旦匹配到就往前弹栈

做法也一样

但是在\(AC\)自动机上暴力跳\(fail\)是要\(T\)的

我们并没有必要去暴力跳\(fail\),只需要存下往后跳\(fail\)能跳到的成功的位置是哪里就好了

这个在预处理的时候处理一下就好了

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define re register
#define maxn 100005
char S[maxn],T[maxn];
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
int son[maxn][26],flag[maxn],fail[maxn],vis[maxn],st[maxn],sta[maxn],to[maxn];
int n,cnt,top;
inline void ins()
{
scanf("%s",S+1);
int len=strlen(S+1);
int now=0;
for(re int i=1;i<=len;i++)
{
if(!son[now][S[i]-'a']) son[now][S[i]-'a']=++cnt;
now=son[now][S[i]-'a'];
}
flag[now]=len;
}
inline void Build()
{
std::queue<int> q;
for(re int i=0;i<26;i++) if(son[0][i]) q.push(son[0][i]);
while(!q.empty())
{
int k=q.front();q.pop();
if(flag[fail[k]]) to[k]=fail[k];
else to[k]=to[fail[k]];
for(re int i=0;i<26;i++)
if(son[k][i]) fail[son[k][i]]=son[fail[k]][i],q.push(son[k][i]);
else son[k][i]=son[fail[k]][i];
}
}
inline void AC_query()
{
int len=strlen(T+1);
int now=0;
for(re int i=1;i<=len;i++)
{
now=son[now][T[i]-'a'];
st[++top]=now,sta[top]=i;
for(re int j=now;j;j=to[j])
if(flag[j])
{
int t=flag[j];
while(t--) vis[sta[top--]]=1;
now=st[top];
break;
}
}
for(re int i=1;i<=len;i++) if(!vis[i]) putchar(T[i]);
putchar(10);
}
int main()
{
scanf("%s",T+1);
scanf("%d",&n);
for(re int i=1;i<=n;i++) ins();
Build();
AC_query();
return 0;
}

最新文章

  1. Javascript学习笔记1
  2. The Zero
  3. ubuntu13.04环境hadoop1.2.1单机模式安装
  4. angularjs中ng-change使用方法
  5. angular.js ng-class-even ng-class-odd ng-cloak(没啥技术含量)
  6. Spring入门(2)-通过构造器注入Bean
  7. iOS开发中的MVC设计模式
  8. MySQL之数据的备份与还原
  9. C#在window服务配置Log4Net.dll
  10. TJOI2018Party
  11. 项目Alpha冲刺(团队)-第五天冲刺
  12. layer.conifrm 非阻塞执行 ztree删除节点 问题
  13. Linux下安装 jdk
  14. OpenCV——图像的载入、显示、输出到文件和滑动条、鼠标操作
  15. CSDN开源夏令营 基于Compiz的switcher插件设计与实现之编译compiz源代码
  16. Linux下rz,sz与ssh的配合使用,实现文件传输
  17. Notepad++的json 格式化
  18. asp.net如何实现负载均衡方案讨论
  19. LoadJS
  20. nodepad++的python环境变量设置

热门文章

  1. Web 前端 中高难度问题(希望看完之后的你可以拿到Offer^v^)
  2. python学习8-闭包、迭代器(转载)
  3. Java 写入pdf文件
  4. 初探angular
  5. Eclipse的企业开发时常用快捷键使用、优化配置(博主推荐)
  6. URAL ——1249——————【想法题】
  7. mysql三:表操作
  8. Don&#39;t forget, a person&#39;s greatest emotional need is to feel appreciated.
  9. 关于i 标签盛放背景图像
  10. LeetCode刷题系列——Add Two Numbers