博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P3808 【模板】AC自动机(简单版) (AC自动机优化板子)
阅读量:3898 次
发布时间:2019-05-23

本文共 1286 字,大约阅读时间需要 4 分钟。

题中有一个坑点,就是模式串可以相同,并且全部计数。

#include 
using namespace std;const int maxn=1e6+10;const int N=maxn;char str[maxn];struct Dfa {
int trie[N][26],cnt; int e[N]; int fail[N]; char ch; void init(char c) {
memset(trie,0,sizeof(trie)); memset(e,0,sizeof(e)); memset(fail,0,sizeof(fail)); cnt=0; ch=c; } void insert(char * s) {
int p=0; for (int i=0;s[i];i++) {
int to=s[i]-ch; if (trie[p][to]==0) {
trie[p][to]=++cnt; } p=trie[p][to]; } e[p]++; } void build() {
queue
q; for (int i=0;i<26;i++) {
if (trie[0][i]) {
q.push(trie[0][i]); } } while (!q.empty()) {
int root=q.front(); q.pop(); for (int i=0;i<26;i++) {
if (trie[root][i]) {
fail[trie[root][i]]=trie[fail[root]][i]; q.push(trie[root][i]); } else {
trie[root][i]=trie[fail[root]][i]; } } } } long long query(char * s) {
long long ans=0; int p=0; for (int i=0;s[i];i++) {
p=trie[p][s[i]-ch];//第一层的空节点k trie[0][k]=0 for (int j=p;j&&~e[j];j=fail[j]) {
ans+=e[j]; e[j]=-1; } } return ans; }}dfa;int main(){
int n; dfa.init('a'); scanf("%d",&n); while (n--) {
scanf("%s",str); dfa.insert(str); } dfa.build(); scanf("%s",str); printf("%lld\n",dfa.query(str)); return 0;}

转载地址:http://cruen.baihongyu.com/

你可能感兴趣的文章
JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
查看>>
JavaWeb学习总结(四十九)——简单模拟Sping MVC
查看>>
Struts1和Struts2的区别和对比(完整版)
查看>>
在Eclipse中初用lucene
查看>>
lucene在eclipse下运行
查看>>
eclipse 安装struts2 插件
查看>>
Liferay配置文件Tag标签参考
查看>>
JavaLiferay研究之十六:FCKeditor如何插入服务器上的资源?
查看>>
Liferay研究之十二:对Liferay框架的几点分析总结 收藏
查看>>
Eclipse快捷键大全(转载)
查看>>
Google爬虫如何抓取JavaScript的?
查看>>
SAP HANA SQL/MDX及TCP/IP端口介绍
查看>>
SAP HANA使用XS和HTTP创建proxy
查看>>
SAP HANA SLT在表中隐藏字段并传入HANA的方法
查看>>
SAP HANA关于触发器的深入理解
查看>>
CSDN要求必须绑定手机号
查看>>
SAP HANA查看某一用户最后登录时间及无效连接次数
查看>>
讲讲BW/4 HANA和BW on HANA的区别
查看>>
SAP HANA CREATE SCHEMA
查看>>
SAP HANA CREATE TABLE
查看>>