隐藏页面特效

AC自动机 模板

 

 

 

1|0【模板】AC自动机(简单版)


1|1题目背景


# 通过套取数据而直接“打表”过题者,是作弊行为,发现即棕名。 这是一道简单的AC自动机模板题。 用于检测正确性以及算法常数。 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交。 **管理员提示:本题数据内有重复的单词,且重复单词应该计算多次,请各位注意**

1|2题目描述


给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。

1|3输入输出格式


输入格式

 

第一行一个n,表示模式串个数; 下面n行每行一个模式串; 下面一行一个文本串。

输出格式

 

一个数表示答案

1|4输入输出样例


输入样例 #1

2 a aa aa

输出样例 #1

2

1|5说明


subtask1[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6,n=1;
subtask2[50pts]:∑length(模式串)<=10^6,length(文本串)<=10^6;
 
#include<queue> #include<stdio.h> const int N=1e6+5; const int sz=26; int T,n,ans,cnt=1,now,p,fail[N],tag[N],tr[N][sz];char s[N<<1]; #define son (s[i]-'a') void insert(){ now=1; for(int i=0;s[i];i++){ if(!tr[now][son]) tr[now][son]=++cnt; now=tr[now][son]; } tag[now]++; } std::queue<int>q; void acmatch(){ q.push(1); fail[1]=0; for(int i=0;i<sz;i++) tr[0][i]=1; while(!q.empty()){ now=q.front();q.pop(); for(int i=0;i<sz;i++){ if(!tr[now][i]) continue; for(p=fail[now];p&&!tr[p][i];p=fail[p]); fail[tr[now][i]]=p?tr[p][i]:1; q.push(tr[now][i]); } } } void solve(){ p=1; for(int i=0;s[i];i++){ for(;p&&!tr[p][son];p=fail[p]); p=p?tr[p][son]:1; for(int j=p;j&&~tag[j];j=fail[j]){ ans+=tag[j]; tag[j]=-1; } // -1 break to faster } printf("%d\n",ans); } #undef son int main(){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%s",s),insert(); acmatch(); scanf("%s",s); solve(); return 0; }

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/12675525.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示