模板题和一些坑点:
1.输入的单词可能会有重复的,重复的单词不用重复计算,将相同单词的最小id保存下来就行
2.朴素的AC自动机算法最后一个点会T,用last优化,直接跳到单词末节点,效率提高十分显著。
代码如下:

#include<bits/stdc++.h>//lst优化
#define lowbit(x) ((x)&(-(x)))
#define ll long long
#define INF 0x3f3f3f3f
#define CLR(a) memset(a, 0, sizeof(a))
using namespace std;
const int maxn=1e6+300;
int vis[205],n,mp[205];
struct Trie{int nxt[maxn][27],fail[maxn],end[maxn],lst[maxn]; int cnt; void insert(char buf[],int id){int len=strlen(buf);int now=0;for ( int i=0;i<len;i++ ){int x=buf[i]-'a';if (!nxt[now][x]) nxt[now][x]=++cnt;now=nxt[now][x];}if(!end[now]) end[now]=id;mp[id]=end[now];mp[id]记录的是与第k号单词相同的单词的最小编号,这样可以解决重复单词}void build(){queue<int>q;for (int i=0;i<26;i++) if(nxt[0][i]) q.push(nxt[0][i]);while (!q.empty()){int now=q.front();q.pop();for ( int i=0;i<26;i++ ){int x=nxt[now][i];if (!x) nxt[now][i]=nxt[fail[now]][i];else{ fail[x]=nxt[fail[now]][i];lst[x]=end[fail[x]]?fail[x]:lst[fail[x]];//last优化q.push(x);}}}}void query(char buf[]){ int len=strlen(buf);int now=0;int res=0;for ( int i=0;i<len;i++ ) { if(buf[i]=='#'){now=0;continue;}now=nxt[now][buf[i]-'a'];if(end[now]) vis[end[now]]++;int tmp=lst[now];while ( tmp ){vis[end[tmp]]++;tmp=lst[tmp];}}for(int i=1;i<=n;i++) printf("%d\n",vis[mp[i]]);}
}ac;
char buf[maxn],s[maxn];
int main() {scanf("%d",&n);for(int i=1;i<=n;i++){CLR(s);scanf("%s",s);ac.insert(s,i);int len=strlen(s);s[len]='#';strcat(buf,s);} ac.build();ac.query(buf);return 0;
}

[AC自动机]luoguP3966相关推荐

  1. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  2. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  3. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  4. Keywords Search AC自动机QAQ

    AC自动机,一直以来都以为是一个非常高大上的算法,其实它还真的挺高大上的. 首先来说,ac自动机的思想与kmp类似,需要自己模拟来理解. 给两个博客: http://www.cppblog.com/m ...

  5. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  6. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

  7. HDU2896(AC自动机模版题)

    AC自动机模版题: 方法一:超时 #include<iostream> #include<algorithm> #include<cstring> #include ...

  8. HDU2222(AC自动机模版题)

    AC自动机是Trie树和KMP的结合物,但是其实KMP在这里体现了思想,而Trie树才是最重要的,要想学懂AC自动机,学习Trie树是必须的,这些是自己在学习AC自动机的个人看法,我也是在网上学习了大 ...

  9. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  10. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)

    P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...

最新文章

  1. 丢人现眼……GitHub阿波罗11号代码仓库惨遭中文灌水
  2. python 3.5-安装python3.5
  3. 动态规划--用最少的硬币类别找零钱
  4. 检查本机显卡的cuda信息及适配cuda-sdk版本
  5. FPGA(5)--VHDL--10十进制计数器及7段显示译码器
  6. Android Studio如何减小APK体积
  7. mysql取消mvvc机制_MySQL探秘(六):InnoDB一致性非锁定读
  8. amazeui学习笔记--css(常用组件1)--小徽章Badge
  9. linux时间类型localtime_r
  10. 【Python3网络爬虫开发实战】1.5.1-PyMySQL的安装
  11. thinkphp3.2.3漏洞_Chrome新版本修复CVE202015999 0 day漏洞
  12. 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
  13. 在 macOS 中如何使用「预览」批量调整图片大小?
  14. HDU/HDOJ 1800 Flying to the Mars 搜索
  15. php代码审计_代码审计|PHP反序列化初识
  16. 学计算机信息管理专业的感谢,2014年计算机信息管理专业自荐信
  17. 路由器显示找不到服务器从新设置,怎么重新设置路由器ip地址
  18. nodejs免安装版安装
  19. windows10 freeswitch soundtouch 变声
  20. 服务器上可以重装操作系统吗,服务器操作系统可以重装

热门文章

  1. 再次推荐下这本书 —— DDIA
  2. NR 5G SSB介绍
  3. Google SketchUp Cookbook: (Chapter 2) Following Paths with Follow Me
  4. 前沿科技分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
  5. Rush rush 。◕.◕。
  6. UTC时间与北京时间和纽约的时间
  7. pythonpath环境变量pth_.pth 文件扩展python环境路径
  8. 键盘上所有特殊符号的英文读法
  9. 书摘---创业36条军规4:如何组建公司
  10. Python list列表---学习总结