当前位置: 首页 > news >正文

P3808 AC 自动机(简单版)

P3808 AC 自动机(简单版)

大意

求多少个模式串在目标串中出现。

思路

如果说是一对一的匹配,我们可以用 KMP,这倒是好方法,但是对于多个串呢?

那我们尝试用 Trie + KMP 实现一个新的东西,也就是 AC 自动机。

何为 AC 自动机,不能直接 AC 题目,就是专门针对一对多的模式串匹配问题。

具体的做法是这样的,首先先把所有的模式串建成一颗 Trie 树,利用 KMP 的思想对树上的所有节点构建失配指针 fail,对于 Trie 树中的一个节点 \(u\),它的 fail 指针指向节点 \(v\),当且仅当:\(v\) 节点所代表的字符串,是 \(u\) 节点所代表的字符串的“最长后缀”。

注意这里的后缀的概念,与 KMP 稍有不同。

至于 fail 指针的构建,这里有一个例子:如果节点 \(u\) 的路径代表字符串 ABCD,我们希望它的 fail 指针指向代表 BCD 的节点;如果 BCD 不存在,就指向 CD;以此类推,直到指向空串(根节点)。

具体来说是这样的:

  • 如果子节点 \(v\) 存在:\(v\) 的 fail 指针 \(= u\) 的 fail 指针所指向节点的对应字符 \(i\) 的子节点。
  • 如果子节点 \(v\) 不存在:为了优化,我们直接让 \(u\) 的子节点 \(i\) 指向 \(fail[u]\) 的子节点 \(i\)

AC

这是构建的动图过程。

代码

#include<iostream>
#include<queue>
using namespace std;const int MAXN = 1e6 + 5;
int ch[MAXN][26], cnt[MAXN], idx = 0;
int fail[MAXN], n;
char c[MAXN];void Insert(char *s){int now = 0;for(int i = 0;s[i];i ++){int x = s[i] - 'a';if(!ch[now][x]){ch[now][x] = ++idx;}now = ch[now][x];}cnt[now] ++;
}void build(){queue<int> q;for(int i = 0;i < 26;i ++){if(ch[0][i]){q.push(ch[0][i]);}}while(!q.empty()){int u = q.front(); q.pop();for(int i = 0;i < 26;i ++){if(ch[u][i]){fail[ch[u][i]] = ch[fail[u]][i];q.push(ch[u][i]);}else ch[u][i] = ch[fail[u]][i];}}
}int query(char *s){int res = 0, now = 0;for(int k = 0;s[k];k ++){now = ch[now][s[k] - 'a'];for(int v = now;v && cnt[v] != -1;v = fail[v]){res += cnt[v];cnt[v] = -1;}}return res;
}int main(){cin >> n;for(int i = 1;i <= n;i ++){cin >> c;Insert(c);}build();cin >> c;cout << query(c) << '\n';return 0;
}
http://www.jsqmd.com/news/396731/

相关文章:

  • Alpine Linux容器中安装工具示例
  • springboot高校大学生创新创业项目管理系统-Pycharm django
  • qwen3.5-plus识别原神按钮groundingbox
  • Agent实习模拟面试之具身智能:如何赋予大模型“双手”与“眼睛”——从工具调用到多模态感知的深度解析
  • 基于Python基于flask的出国留学信息国外大学学校推荐系统的设计与实现-Pycharm django
  • 案例分享——MCP改进提案在生产中落地的例子
  • 基于Python基于flask的大学生招聘求职系统-Pycharm django
  • 生成引擎优化(GEO)在提升内容创作效率与用户体验方面的创新策略分析
  • Agent实习模拟面试之企业级大模型融合架构:从单点调用到智能中枢的系统设计深度拷问
  • 强烈安利!圈粉无数的AI论文平台 —— 千笔ai写作
  • 导师严选! 降AI率软件 千笔·降AIGC助手 VS speedai,专科生专属高效选择
  • Agent实习模拟面试之Agentic 代理模式:从单智能体到多智能体协同的系统设计深度拷问
  • 横评后发现 8个AI论文平台:专科生毕业论文写作全攻略
  • 用实力说话!降AI率软件 千笔·降AI率助手 VS speedai 专科生专属首选
  • 一遍搞定全流程!断层领先的AI论文网站 —— 千笔写作工具
  • 「Chrome 扩展开发」系列入门教程
  • 写作小白救星!9个AI论文写作软件深度测评,继续教育毕业论文必备工具推荐
  • 滑雪问题
  • USB线选购指南2026:避开3大陷阱,选到耐用快充的好线 - 速递信息
  • 洛谷 P1801:黑匣子 ← 二叉堆
  • 运动木地板怎么选?洛可风情5S全价值方法论破解选型困局 - 速递信息
  • Python Streamlit介绍(开源Python Web应用框架,快速将Python脚本转换成交互式Web应用,适合数据科学和机器学习项目快速展示)
  • 【强化学习的数学原理-赵世钰】随记
  • 2026年北京飞亚达手表维修推荐:权威网点深度评价,针对维修时效与质量痛点指南 - 十大品牌推荐
  • 2026年北京古驰手表维修推荐:权威网点综合排名,针对非官方服务品质痛点 - 十大品牌推荐
  • P10657 BZOJ4998 星球联盟
  • 如何选择可靠手表维修点?2026年北京海鸥手表维修评测与推荐,直击非官方与乱报价痛点 - 十大品牌推荐
  • 如何选择维修点?2026年北京法穆兰手表维修推荐与排名,直击技术隐忧 - 十大品牌推荐
  • 2026年北京梵克雅宝手表维修推荐:高端腕表保养深度评价,涵盖复杂机芯与日常维护场景 - 十大品牌推荐
  • 2026年北京冠蓝狮手表维修推荐:多场景服务评价与排名,直击非官方维修站信任痛点 - 十大品牌推荐