AC自动机
来源:互联网 发布:力劲注塑机怎么调数据 编辑:程序博客网 时间:2024/05/29 07:01
一个自动AC的东西...
套用KMP的fail指针,然后再是利用字典树进行字典与文章的匹配
以下是模板
#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)#define DOR(i,x,y) for(int i=(x),i##_end_=(y);i>=i##_end_;i--)struct Aro{ static const int maxn=500005; int tot,pre[maxn][26],fail[maxn],cnt[maxn],Q[maxn]; int newnode(){ tot++; FOR(i,0,25)pre[tot][i]=0; cnt[tot]=fail[tot]=0; return tot; } void init(){tot=-1;newnode();} void build(){ int L=0,R=0; FOR(i,0,25)if(pre[0][i])Q[++R]=pre[0][i]; while(L<R){ int k=Q[++L]; FOR(i,0,25){ if(pre[k][i]){ Q[++R]=pre[k][i]; fail[pre[k][i]]=pre[fail[k]][i]; } else pre[k][i]=pre[fail[k]][i]; } } } void insert(char *str){ int len=strlen(str),cur=0; FOR(i,0,len-1){ int k=str[i]-'a'; if(!pre[cur][k])pre[cur][k]=newnode(); cur=pre[cur][k]; } cnt[cur]++; } int query(char *str){ int len=strlen(str),cur=0,ans=0; FOR(i,0,len-1){ int k=str[i]-'a'; cur=pre[cur][k]; int now=cur; while(~cnt[now]&&now){ ans+=cnt[now]; cnt[now]=-1; now=fail[now]; } } return ans; }}ACA;char str1[1000005];int main(){ int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); ACA.init(); FOR(i,1,n){ char str[55]; scanf("%s",str); ACA.insert(str); } ACA.build(); scanf("%s",str1); printf("%d\n",ACA.query(str1)); } return 0;}
阅读全文
1 0
- AC自动机...
- AC自动机
- AC 自动机
- AC自动机
- AC自动机
- ac自动机
- ac自动机
- AC自动机
- AC自动机
- AC自动机
- AC自动机
- AC自动机
- AC 自动机
- ac自动机
- AC自动机
- AC自动机
- AC自动机
- AC自动机
- STM32-IIC
- AVPacket,是压缩数据的结构体(解码前或编码后的结构体)。
- Python基础知识之文件读写与修改
- 对于stm32单片机的
- 欢迎使用CSDN-markdown编辑器
- AC自动机
- spring与spring-data-redis整合redis
- Python基础知识之装饰器decorator
- ubuntu装机配置及常用软件安装笔记
- centos6.8下emqtt集群安装配置与测试验证
- 驱动调试-根据oops定位错误代码行
- 软删除
- [BZOJ 2115 Wc2011 Xor]线性基
- Python基础知识之迭代器