题目:https://www.luogu.com.cn/problem/P3966

题意:给出nnn个单词组成一篇文章,问:每个单词分别在文章中出现过几次

思路
学习的时候参考了大佬的题解:https://www.luogu.com.cn/blog/scp-d14134/ti-xie-p3966-tjoi2013-dan-ci-post

  • 这道题很容易想到ac自动机,建树的过程中统计每个子串出现的个数,然后查询n次,但显然,这样就 会TLETLETLE!
  • 这个时候我们就需要用到一个failfailfail 树,我们都知道ac自动机中的failfailfail指针,failfailfail树就是将failfailfail指针所指的值和表示的边建出来的树
  • 这道题只需要跑一遍ac自动机,统计每个子串出现的个数。然后一个节点表示的字符串在整个文章中出现的次数相当于它在failfailfail树中子树的权值的和。

代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define pb push_back
#define MAXN 1100010using namespace std;typedef  long long ll;
typedef pair<int,int>P;
int trie[MAXN][30],cntword[MAXN],vis[MAXN],fail[MAXN];//trie树,节点个数,单词结尾点的下标,fail数组
int que[MAXN];
char s[MAXN];
int tot;
void Insert(char *a,int idx)
{int root=0;for(int i=0;a[i];i++){int x=a[i]-'a';if(!trie[root][x])trie[root][x]=++tot;root=trie[root][x];cntword[root]++;}vis[idx]=root;
}
void getfail()
{int head=0,tail=0;for(int i=0;i<26;i++)if(trie[0][i])que[++tail]=trie[0][i];while(head<tail){int now=que[++head];for(int i=0;i<26;i++){if(trie[now][i]){que[++tail]=trie[now][i];fail[trie[now][i]]=trie[fail[now]][i];}else trie[now][i]=trie[fail[now]][i];}}for(int i=tot;i>=0;i--)cntword[fail[que[i]]]+=cntword[que[i]];//按照dfs序将儿子节点的值更新到父节点中
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",s);Insert(s,i);}getfail();for(int i=1;i<=n;i++)printf("%d\n",cntword[vis[i]]);return 0;
}

【AC自动机】P3966 [TJOI2013] 单词相关推荐

  1. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  2. hdu5384(AC自动机+纪录重复单词出现的次数)

    题意: 给出n篇文章,m个单词,输出每篇文章中单词出现的次数,其中单词会重复. 思路: AC自动机模板题,添加一个单词的结尾标记记录即可.这里我们用了kuangbin的模板. 代码: #include ...

  3. 【YbtOJ AC自动机 - 1】单词查询

    单词查询 题目 给定 nnn个长度不超过 505050 的由小写英文字母组成的单词用于查询,以及一篇长为 mmm 的文章,问:文中出现了多少个待查询的单词.多组数据 输入 第一行一个整数 TTT,表示 ...

  4. P3966 [TJOI2013]单词

    \(\color{#0066ff}{ 题目描述 }\) 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. ...

  5. ac自动机,自动ac机(bushi

    哈哈哈哈我学明白了也许吧.挂几篇题解: b站的这个up讲得太好啦:https://www.bilibili.com/video/BV1uJ411Y7Eg?p=3&vd_source=f5170 ...

  6. AC自动机讲解超详细

    begin:2019/5/2 update 2020/6/12 更新了LaTeX(咕了好久 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMPKMPKMP被NextNextNex ...

  7. 【GDOI2017第三轮模拟day2】魔法咒语(AC自动机,矩阵乘法)

    Description Solution 这道题目的60分非常的简单,直接用ac自动机直接搞一搞就好了. 但是后面的40分怎么做? 我们发现后面的40分全部都是基本单词长度不会大于2,所以我们可以考虑 ...

  8. bzoj 3172: [Tjoi2013]单词 AC自动机

    3172: [Tjoi2013]单词 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  9. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你NNN个单词,请你求出每一个单词在这NNN个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. LinkLinkLink [洛谷3796][模板]AC自动 ...

  10. 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

最新文章

  1. 08Factory Method(工厂方法)模式
  2. 【五线谱】五线谱的线与间 ( 五线谱中的 第N线与第N间 | 五线谱上的 上加N线与上加N间 | 五线谱下的 下加N线与下加N间 | 高音谱号下加一线 等同于 低音谱号上加一线 )
  3. 在springboot中使用easyexcel导出数据excel表格
  4. 考研【财经方向专场讲座】
  5. java 生成 xml dtd_使用DTD文件中的JAXB生成Java类 – 如何修改DTD?
  6. django model数据 时间格式
  7. H5微信分享朋友、朋友圈、QQ
  8. 架构设计 | 分布式体系下,服务分层监控策略
  9. java代码示例(6-2)
  10. antd table动态表头_react动态配置antd table的columns
  11. 第三季-第5课-Linux编程规范
  12. 产品特点概述-驰骋工作流
  13. 计算机磁盘管理只有C盘怎么办,新电脑只有C盘怎么办?手把手教你给硬盘分区!...
  14. 电容或电感的电压_为什么并联电容器可以提高功率因数,而串联不行?
  15. 经营微博的十个经典案例
  16. MSVCR100.dll丢失
  17. mysql 从库跳过1062_3分钟解决MySQL 1062 主从错误
  18. 【Python学习记录】Numpy广播机制(broadcast)
  19. 概率论与数理统计学习笔记——第三十五讲——依概率收敛,切比雪夫不等式
  20. 51nod1298 圆与三角形

热门文章

  1. PPT课件实现连连看游戏——简单好用
  2. java碳纤维山地车车架咋样_自行车碳纤维车架值得买吗?它有哪些优缺点?老骑手来给你答案!...
  3. 盛迈坤电子商务:网店有哪些营销活动
  4. 沐阳从0到1零基础学习安卓逆向
  5. 昆山花桥房都要上万 上海买家占9成“江山”
  6. java 所得税计算_java个人所得税计算器
  7. 一堂难忘的计算机课作文,难忘的一节微机课_800字
  8. HTML5小游戏程序案例--冰桶挑战h5案例
  9. Win11新建不了文本文档?Win11右键无法新建文本文档的解决方法
  10. BeyondCompare4破解最佳实践