首页 > 其他分享 >片集 - 字符串 - 1

片集 - 字符串 - 1

时间:2024-07-22 20:18:48浏览次数:8  
标签:AC 拓扑 片集 字符串 fail 自动机 模板 字典

欢迎来看 “片” (的简介)

由于-\(看片\)-生涯转瞬即逝,于是我选择对“\(片\)”进行一定的总结:

相信你一定看懂了

由于开始的时间有一点晚,就姑且认为我以后会慢慢补充吧......

字典树 Trie \(P8306\) \(【模板】\) \(字典树\)

解:字典树
要不是因为颓废,我早就把这个过了
非常简单,就是不停的向下建树,时间复杂度就是 \(string\) 的所有长度
那 \(3\times 10^6\) 是不是给少了?

\(P4036\) \([JSOI2008]\) \(火星人\) \((歪)\)

解:字符串,平衡树(暴力

为什么要看题解呢?因为有些时候你可以大幅度偷工减料
看着好像是紫题,但却是橙题,直接暴力枚举,但 \(I\) 操作要用一下 \(String\) 的 \(Insert\) 操作,注意字符串的插入也只能插入 \(string\) 型。
至于它实际上想让我写的,可能 “未来” 某一天等我看懂平衡树会写出来吧,姑且认为那一天遥遥无期

AC 自动机 Aho-Corasick automaton \(P3808\) \(AC\) \(自动机\)

解: AC 自动机

首先,你要掌握字典树,大致了解一下 \(KMP\) 的思路,就是不回溯,然后你可以一步步做接下来的题目。

这个是模板模板题。

\(AC\) 自动机就是在字典树的基础上加入 \(Fail\) 数组,用来辅助你不直接跳到根节点重新搜索, 在整个过程中,加入操作与字典树建树完全一致,唯一不同的就是加入了 \(getfail\) 操作,来帮助后面你查询, 这个操作就是记录到父亲结点的 \(fail\) 并在将 \(fail_u\) 赋值为 \(fail_{fath}\) 的节点儿子中对应的同元素的节点,具体实现用 \(bfs\)。

整个“树”就会进化成这样:

AC 自动机fail 数组示意图

绿边连向的点就是 \(fail\) 数组种的元素

(RT 被van了

查询就非常轻松了,由于赋值 \(fail\) 时是用父亲的元素进行的,所以可以保证不会有中间某一个元素不是我们查询串的元素的情况,所以每次加上对应 \(fail\) 的 \(cnt\) 值,在结束当前的字符串之后继续依照 \(fail\) 跳到下一个可以被查询的字符串中。

打完模板之后,再大另外几个模板:

\(P3796\) \(AC\) \(自动机\) $(简单版 $ \(II)\)

解:
在原本的模板基础上,去除查询中的 \(cnt\) 的赋为 \(-1\) 的操作,于是就可以算出每一个东西的具体出现此时,而后,排序,输出即可,注意没有 \(SPJ\) 要按照输入顺序输出。

\(P5357\) \(【模板】\) \(AC\) \(自动机\)

解:
可以发现,在 \(trie\) 上跑不停地向前非常恶心,不妨给它压缩一下,什么意思呢? 拓扑排序,这样的话,就是从头往下不断的加上价值,在此之前,现将 \(S\) 的贡献加上去,后面拓扑把价值加上然后再后续输出的时候依据之前记录的地址输出即可(感觉讲了个寂寞,不讲了,看代码吧,dsc教的

想了一会,还是强行说一下吧,拓扑排序就是先把没有依赖的点的贡献加上,再不断地向后继中出自己外没有依赖的点前进,又因为整个图上不存在我是你的 \(fail\), 你又是我的 \(fail\) 的关系,即整个 \(fail\) 形成的形状是一个 \(DAG\) 因此,首先运用拓扑排序是不会有意义上的问题的,其次,正如上面所说的先后关系,对图进行拓扑排序求得的答案首先不会出现矛盾,其次也不会出现错误,为什么呢? (不知道,性感理解一下,你看没有矛盾不就是不会有错误,是正确的了吗?

它优化了什么呢?
最片面的来看,在 模板二 中,\(getans\) 函数是有两次循环的,这样你就发现这一个模板所做的事情了,实际上就是先把最后输入的 \(S\) 串的贡献县加在路径上,然后用拓扑排序的形式将答案往下传,于是就从 \(\mathcal{O}(nm)\) 降到了 \(\mathcal{O}(n+m)\) (感觉很傻是吧,是不是感觉肯定有其他算法可以代替它

欸,下面是拓扑的时候都入队节点顺序,\(\textcolor{purple}{紫}\) -> \(\textcolor{#FFD700}{黄}\) -> \(\textcolor{orange}{橙}\) -> \(\textcolor{blue}{蓝}\) , 可以发现,最开始将 \(S\) 串放进来没有任何影响,一个个拓扑是没有问题的 (就当作是在瞎扯吧

左上角是S的名称,图里没什么用,请忽略

标签:AC,拓扑,片集,字符串,fail,自动机,模板,字典
From: https://www.cnblogs.com/Aaron-Yao-Aloe/p/18316810

相关文章

  • 数据库中字符串连接符的使用
    在数据库操作中,字符串处理是日常工作中不可或缺的一部分。无论是构建动态查询,还是处理数据输出,字符串连接符的使用都是至关重要的。那么,如何正确地使用字符串连接符,才能高效地进行字符串操作呢? 在数据库中,字符串连接符的具体使用方法是什么?我们应该如何利用这些连接符来简化......
  • 字符串 & 哈希
    由于笔者不常使用哈希,且整理不够全面,本文只做启发。哈希寻找一个映射函数\(f\)把一个集合映射到一个有限集合,使得不同元素映射的值不同,相同元素的值相同。我们希望这个函数能让我们快速判断两个字符串是否相同。构造字符串的哈希一般构造如下:template<unsignedbas=131,u......
  • 保存 Cisco 设备配置的 2 个字符串之间的区别
    我有2个变量,config1和config2保存Cisco设备在2个不同时间点的运行配置。运行配置示例:version12.3noservicepadservicetimestampsdebugdatetimemsecservicetimestampslogdatetimemsecnoservicepassword-encryption!hostnameretail!boot-star......
  • c++中字符串之string和char
    c++string初始化的几种方式相对于C#来说,c++中string的初始化方式真的非常多,比如以下都可以用来初始化string:usingnamespacestd;intmain(){ stringstr1="test01";//直接赋值 stringstr2(5,'c');//结果:str2='ccccc',以length为长度的ch的拷贝(即length个ch) ......
  • Redis底层数据结构-简单动态字符串SDS
    简单动态字符串(simpledynamicstring,SDS)。Redis没有直接使用C语言传统的字符串,而是自己构建了一种简单动态字符串(SDS)的抽象类型。C字符串只会作为字符串字面量(stringliteral)用在一些无须对字符串值进行修改的地方。实现sds.h/sdshdrstruct__attribute__((__packed__)......
  • 字符串和数字过滤器
    什么是过滤器?实质上就是一个转换函数。变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。常用的过滤器有: 1、字符串的过滤器<body>{#当变量未定义时,显示默认字符串,可以缩写为d#}<p>{{name|default('Noname')}}</p>{#单词首......
  • leetcode位运算(1684. 统计一致字符串的数目)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。后续开始专项练习。描述实现原理与步骤1.本题重点掌握相应字符bit位的编码规则2.bitArray和tempBitArray或之后还等于bitArray,说明bitArray包含tempBitArray代码实现classSolution{publ......
  • 常见的Python编程题目及其代码(十二)-- 56. 检查字符串是否只包含数字57. 找到列表中出
    目录56.检查字符串是否只包含数字57.找到列表中出现次数最多的元素58.计算字符串中的元音数59.计算字符串中的辅音数60.找到字符串中的最长单词 56.检查字符串是否只包含数字s="12345"print(s.isdigit())57.找到列表中出现次数最多的元素fromcollection......
  • 字符串的创建辨析
    字符串的创建辨析Strings="1"*使用引号创建字符串会在常量池中寻找有则直接返回没有则创建Strings=newString("1");*使用new创建如果常量池没有"1"则在常量池中创建"1"再在堆中创建String并返回地址给引用*使用s.intern()如果常量池中没有与字符串相同的字符串(判......
  • Leetcoede编程基础0到1——459.重复的子字符串 & 283.移动零 &1822.数组元素积的符号
    459.重复的子字符串给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。示例1:输入:s="abab"输出:true解释:可由子串"ab"重复两次构成。示例2:输入:s="aba"输出:false示例3:输入:s="abcabcabcabc"输出:true解释:可由子......