首页 > 其他分享 >单词

单词

时间:2024-08-15 10:50:45浏览次数:12  
标签:AC 每个 模式 单词 枚举 fail 自动机

考虑暴力怎么做。一个很自然的想法就是枚举每个模式串,并将当前枚举到的模式串作为文本串,然后内层循环再依次枚举模式串,看每个模式串在文本串中出现了多少次

发现上述过程与AC自动机的匹配很像,于是建立AC自动机,将每个串都放在AC自动机上跑query,当前跑到的u就代表这个串的一个前缀,然后让j=u一直跳fail,给途中经过的每个点都加上一,表示当前跑的这个串的前缀对j所表示的串有贡献。这个样子一定不重不漏

考虑优化,不难发现如果从ufail[u]连一条线,最后连出来的图是一个DAG,而且任意一条边的起点的深度一定大于终点的深度,于是可以进行DP,像差分数组一样途中累加贡献就好了

代码的写法:如果完全按照上面的思路来写,就要枚举每个模式串作为文本串,然后将query函数中的内层for循环变成\(O(1)\)的操作(就是直接添加边\((u,fail[u])\)),最后跑拓扑排序。这样子当然没问题,但是有更简单更快速的写法。我们在字典树建立的过程中,就将途中经过的点累加一次,最后直接对所有点跑拓扑排序就好了。由于任意一条边的起点的深度一定大于终点的深度,所以我们直接倒序循环BFS中的点就好了。注意不能倒序循环点的编号,因为编号小的点可能连接编号大的点,如下

image

具体见代码

标签:AC,每个,模式,单词,枚举,fail,自动机
From: https://www.cnblogs.com/dingxingdi/p/18360436

相关文章

  • 编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查
    /编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查找树存储单词及其出现的次数。程序在读入文件后会提供一个有三个选项菜单。第一个选项是列出所有的单词和出现的次数。第二个选项是让用户输入一个单词,程序报告该单词在文件中出现的次数。......
  • 英语二【00015】精选单词练习第六天
    英语二【00015】4000+单词精选提炼单词历史学习记录:英语二【00015】精选单词练习历史英语二4500单词表下载第六天练习boring[ˈbɔ:rɪŋ]adj.无聊的,无趣的contribute[kənˈtribjut]vt.&vi.贡献出remove[riˈmu:v]vt.开除;去除manage[ˈmænɪdʒ]vt.......
  • [题解]P3966 [TJOI2013] 单词
    P3966[TJOI2013]单词用\(p[i]\)来表示经过节点\(i\)的字符串个数。那么节点\(u\)的答案就是fail树上,以\(u\)为根的子树的\(p\)之和。由于我们已经计算了\(p[i]\),所以字符串\(i\)作为模式串本身&模式串前缀的情况已经考虑了。还需考虑\(i\)作为模式串后缀的情况,而只有fail树上......
  • 151. 反转字符串中的单词【 力扣(LeetCode) 】
    一、题目描述  给你一个字符串s,请你反转字符串中单词的顺序。  单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。  返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾......
  • 从我的演讲中识别出特定的单词
    我想实现一个可以在一个人后面重复某个单词的功能。例如:“说娃娃。”可以使用任何其他词来代替娃娃。重点是让助手准确地重复“doll”这个词我想用vosk模块来实现这个。我该怎么做呢?importjsonimportvoskimportpyaudioMODEL_PATH="vosk-model-small-en-us-0.15......
  • 洛谷:P1308 [NOIP2011 普及组] 统计单词数
    题目描述一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要......
  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 【Python】Python中的输入与输出——内附Leetcode【151.反转字符串中的单词】的C语言
    输入与输出导读一、Python中的输出1.1基本用法1.2格式化输出1.3通过`:`格式化值的输出1.4其它格式化输出二、Python中的输入2.1基本用法2.2`split()`方法2.3split()习题演练结语导读大家好,很高兴又和大家见面啦!!!在上一篇内容中我们介绍了Python中的数据类......
  • 编程常用英语单词中英文对照表
    distributed美[dɪˈstrɪbjuːtɪd] 使分布;  分配;  分发;  分销;  分散;  使散开; program 美[ˈproʊɡræm] 程序;  编码指令; BASIS  基础;  标准;  基本;  ASIS 按原来的softwarepackage 美[ˈsɔːftwerpækɪdʒ......
  • 最长最短单词【原创】
    最长最短单词描述输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。试输出第1个最长的单词和第1个最短单词。输入一行句子。输出......