
字符串
文章平均质量分 56
哈希,kmp,Manacher,自动机等
Cosmic_Tree
什么时候才能像杨大佬一样强啊(´;︵;`)
展开
-
Educational Codeforces Round 32 - G. Xor-MST ( 01字典树 + 分治 )
题目链接:点击进入题目题意给你 n 个点的值,n 个点加边生成一棵树,边权就是两点的异或值,要求最后所有边权和最小。输出最小边权和。思路将 n 个数插入到01字典树上,对于树上的每个节点,记录这个节点保存有原数组的那些数(就是原数组中有哪些数经过这个节点),因为这些数可能在原数组中是无序的所以不好保存,因此我们可以将原数组排序后再插入字典树,这样每个节点所保存的数就是连续的,也就是每个节点只记录这个连续区间的边界即可。遍历01字典树,对于两个孩子的节点,左右孩子代表的区间是不同的,代表未连接原创 2022-01-12 16:21:07 · 452 阅读 · 0 评论 -
POJ - 3461 Oulipo( kmp )
题目链接:点击进入题目题意求模式串在文本串中出现多少次思路单模式串匹配 - > kmp代码// Problem: Oulipo// Contest: Virtual Judge - POJ// URL: https://vjudge.net/problem/POJ-3461// Memory Limit: 65 MB// Time Limit: 1000 ms// // Powered by CP Editor (https://cpeditor.org)//#pra原创 2021-08-31 19:35:10 · 188 阅读 · 0 评论 -
CodeForces - 852G Bathroom terminal ( 字典树 + dfs )
题目链接:点击进入题目题意给 n 个匹配串,m 此询问,每次询问给出一个模式串,问模式串能匹配几个匹配串。? 万能匹配符,也可以当作空白。思路将 n 个匹配串插入到字典树中,对于每次询问去字典树上搜索查找,对于 ?的部分,分别将其当作 ’ a ’ - ’ e ’ 以及 空白 来处理。代码// Problem: Bathroom terminal// Contest: Virtual Judge - CodeForces// URL: https://vjudge.net/proble原创 2021-08-26 00:27:29 · 213 阅读 · 0 评论 -
CodeForces - 432D Prefixes and Suffixes ( kmp + dp )
题目链接:点击进入题目题意对所有,长度为 i 的,且存在一个长度为 i 的后缀与它相等的,这样一个前缀,输出长度以及出现次数。思路next 数组的应用,对于每个位置 i ,通过 next [ i ] ,可以知道长度为 next [ i ] 前缀在中间出现一次,因此可以倒序 dp 计算每个前缀出现的次数,然后通过 l = next [ l ] ( l 初始值 len ),遍历所有存在相等后缀的前缀 。dp [ next [ i ] ] += dp [ i ] ( dp 初始值 1 , 因为前缀原创 2021-08-26 00:27:19 · 304 阅读 · 0 评论 -
CodeForces - 948DPerfect Security ( 01字典树 )
题目链接:点击进入题目题意O [ i ] xor Π( p [ i ] )= a [ i ] , Π( p [ i ] )代表对 p 序列的重新排序后 p [ i ] 的下标,给你 p , a 序列,让你求字典序最小的 O 序列思路O [ i ] xor Π( p [ i ] )= a [ i ] =》O [ i ] = a [ i ] xor Π( p [ i ] )让 O [ i ] 尽可能小,就是让 a [ i ] 异或一个 p 值越小越好,那么就顺序遍历每一位,对于原创 2021-08-26 00:27:08 · 216 阅读 · 0 评论 -
CodeForces - 182D Common Divisors( kmp + 最大公约数 )
题目链接:点击进入题目题意若串b可以由x个串a连接组成,那么就认为a是b的除数,例如abab的除数为ab与abab求两个字符串公共除数的数量思路看样例大概可以得知,除数实际上就是最小循环节 t 以及最小循环节的倍数 xt ( 长度上要求 len % xt == 0 ),x 转换一下就是,周期 T = len / t 的所有因子数。( 这个结论是保证在串是完全由最小循环节构成的,否则,串的最小循环节就是它自己 )先判断两个串的最小循环节是否相等,不等就不存在相同除数。若是相等,就对两个串的原创 2021-08-26 00:26:47 · 237 阅读 · 0 评论 -
CodeForces - 126B Password( kmp )
题目链接:点击进入题目题意对字符串 s ,找最长的 t ,满足 t 在 s 的前后缀以及中间部分出现过思路通过 next 数组由长到短枚举 s 所有相同的前后缀,然后在中间部分通过 next 数组找是否出现过这个子串代码// Problem: Password// Contest: Virtual Judge - CodeForces// URL: https://vjudge.net/problem/CodeForces-126B// Memory Limit: 262 MB//原创 2021-08-26 00:26:37 · 281 阅读 · 0 评论 -
CodeForces - 1138D Camp Schedule - ( kmp + 构造 )
题目链接:点击进入题目题意给你文本串 s ,模式串 t ,要求给 s 重新排序,使排序后的文本串出现尽可能多的模式串 t 。输出排序后的 s 。( 字符串为 01 串 )思路按照 kmp 匹配的模式来构造,尽可能满足 s [ i ] = t [ j ] ,若是满足不了啦,那就将剩下的位置剩下的数随便匹配。代码// Problem: Oulipo// Contest: Virtual Judge - POJ// URL: https://vjudge.net/problem/POJ-3原创 2021-08-26 00:26:25 · 277 阅读 · 0 评论 -
CodeForces - 625B War of the Corporations( kmp )
题目链接:点击进入题目题意问在文本串中至少修改几个字母可以使模式串不再在文本串中出现。思路与此题类似实际上求的就是模式串在文本串中出现多少次,要求匹配的子串不能有交集,那么只需要在匹配成功后模式串上的指针 j 不在变成 next [ j ] ,而是从 0 开始就行。代码// Problem: Oulipo// Contest: Virtual Judge - POJ// URL: https://vjudge.net/problem/POJ-3461// Memory Limit:原创 2021-08-26 00:26:06 · 317 阅读 · 0 评论 -
HDU - 1358 Period ( kmp )
题目链接:点击进入题目题意对于 s 长度为 i 的前缀 ( i >= 2 ) ,若是满足完全由循环节构成,且循环周期 k > 1,输出此前缀的长度以及循环周期。思路kmp 判断循环节以及求解循环周期定理:假设 S 的长度为 len ,则 S 存在最小循环节,循环节的长度 L 为 len – next [ len ]如果 len 可以被 len - next [ len ] 整除,则表明字符串 S 可以完全由循环节循环组成,循环周期 T = len / L 。将这个结论里的原创 2021-08-26 00:25:52 · 206 阅读 · 0 评论 -
HDU - 4763 Theme Section( kmp )
题目链接:点击进入题目题意求最大长度的E,那满足给定字符串是EAEBE,A、B可以是任意字符串思路前缀 E ,后缀 E ,最大前后缀?!( 还要判断一下这个长度与 len / 3 的大小关系 )这不 kmp 的 next 数组,对于中间的部分,可以枚举中间的前缀,求出最大的 next [ i ] ,最后再将其与初始的那个最大的取个 min 即可代码// Problem: Oulipo// Contest: Virtual Judge - POJ// URL: https://vjud原创 2021-08-26 00:25:39 · 192 阅读 · 0 评论 -
CodeForces - 7D Palindrome Degree ( 哈希 )
题目链接:点击进入题目题意字符串是 k 回文的,当且仅当它是回文的,同时它的长为 ( l / 2 ) ( 下取整 ) 的前缀跟后缀都是 k - 1 回文的。( 空字符串是 0 回文的 )字符串的回文等级是最大的 k ,s 是 k 回文。求 s 所有前缀的回文等级和思路遍历每个前缀,判断哈希判断是否是回文,若是回文,回文等级 = 长为 ( l / 2 ) ( 下取整 ) 的前缀回文等级 + 1 ,并将其计入答案。( 若是回文串,对于回文等级的计算,可以维护一个前缀的回文等级的数组,因为当前原创 2021-08-23 23:46:07 · 278 阅读 · 0 评论 -
CodeForces - 985F Isomorphic Strings(哈希)
题目链接:点击进入题目思路代码// Problem: Isomorphic Strings// Contest: Virtual Judge - CodeForces// URL: https://vjudge.net/problem/CodeForces-985F// Memory Limit: 262 MB// Time Limit: 3000 ms// // Powered by CP Editor (https://cpeditor.org)//#pragma GCC opt原创 2021-08-23 23:45:54 · 345 阅读 · 0 评论 -
CodeForces - 706D Vasiliy‘s Multiset( 01字典树)
题目链接:点击进入题目题意q次操作:1:+ x 集合加一个x2:- x 集合删一个x3:? x 查询集合中与 x 异或的最大值( 默认集合初始有 0 !!! )思路异或最大值,01字典树,插入、删除、查询功能。插入时对于每个节点统计使用多少次 cnt [ p ] ,删除操作就是对 x 经过的点 cnt [ p ] --。代码// Problem: Vasiliy's Multiset// Contest: Virtual Judge - CodeForces// URL: h原创 2021-08-23 23:45:41 · 230 阅读 · 0 评论 -
HDU - 2072 单词数( 字典树 )
题目链接:点击进入题目思路将每个单词插入到字典树上,记录每个单词的终点,去重后就是答案。( 注意不要将空格插入字典树 )代码// Problem: 单词数// Contest: Virtual Judge - HDU// URL: https://vjudge.net/problem/HDU-2072// Memory Limit: 32 MB// Time Limit: 1000 ms// // Powered by CP Editor (https://cpeditor.org原创 2021-08-23 23:45:30 · 286 阅读 · 0 评论 -
HDU - 2087 剪花布条( kmp )
题目链接:点击进入题目思路单模式匹配,kmp解决。正常的kmp求的是模式串在文本串中出现多少次,模式串对应的文本串的子串互相之间可能会有交集,但是这个题每次匹配成功后就把子串删去了,也就是要求匹配的子串不能有交集,那么只需要在匹配成功后模式串上的指针 j 不在变成 next [ j ] ,而是从 0 开始就行。代码// Problem: Cyclic Nacklace// Contest: Virtual Judge - HDU// URL: https://vjudge.net/probl原创 2021-08-23 23:45:18 · 253 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace ( kmp求最小循环节 )
题目链接:点击进入题目题意就是给你一个字符串,问最少从后面添加几个字符能使其变成全是由循环节循环组成的。( 这个循环至少循环两次 )思路定理:假设 S 的长度为 len ,则 S 存在最小循环节,循环节的长度 L 为 len – next [ len ](1)如果 len 可以被 len - next [ len ] 整除,则表明字符串 S 可以完全由循环节循环组成,循环周期 T = len / L 。(2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数 L – le原创 2021-08-23 23:45:02 · 283 阅读 · 0 评论 -
POJ - 3764 - The xor-longest Path ( 01字典树 + 异或前缀和 )
题目链接:点击进入题目题意找出树上任意不同两点间最大的路径边权的异或值。思路假设 sum [ x ] 表示根节点到 x 路径上所有边权的 xor 值,显然有:sum [ x ] = sum [ father ( x ) ] xor weight ( x , father ( x ) )根据上式,我们可以对树进行一次深度优先遍历,求出所有的 sum [ x ] 。不难发现,树上 x 到 y 的路径上所有边权的 xor 结果就等于 sum [ x ] xor sum [ y ] 。这是因为根据原创 2021-08-18 21:18:36 · 301 阅读 · 0 评论 -
HDU - 4825 - Xor Sum( 01字典树 )
题目链接:点击进入题目思路01trie经典应用,求异或最值。trie 树中存储 a [ 1 ] ~ a [ n ] 对应的 32 位二进制串,查询时,根据“尽量走相反的字符指针”的检索策略,就可以找到所求答案。代码// Problem: Xor Sum// Contest: Virtual Judge - HDU// URL: https://vjudge.net/problem/HDU-4825// Memory Limit: 132 MB// Time Limit: 1000 ms原创 2021-08-18 21:18:16 · 241 阅读 · 0 评论 -
LibreOJ - 10050 - The XOR Largest Pair( 01字典树 )
题目链接:点击进入原创 2021-08-18 21:17:52 · 210 阅读 · 0 评论 -
牛客2020年七夕节比赛 - F - 牛妹的考验( AC自动机 + dp )
题目链接:点击进入题目思路多串匹配,构建AC自动机,对于字符串权值的重复和包含的情况,可以在建 trie 树和求 fail 失配指针的时候进行处理,处理过后对于每个串,也就是每个对应节点,我们会得到它的权值 sum 。然后就是 dp [ i ] [ j ] ,代表长度为 j ,以 i 节点结束的字符串的最大权值。转移式:dp [ to ] [ i + 1 ] = max ( dp [ to ] [ i + 1 ] , dp [ j ] [ i ] + sum [ to ] ) ;( 当前原创 2021-08-08 17:15:14 · 177 阅读 · 0 评论 -
字典树 - 模板
定义字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。性质1、根节点不包含字符,除根节点外每一个节点都只包含一个字符;2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;3、每个节点的所有子节点包含的字符都不相同。应用1、串的快速检索给出 n 个单词组原创 2021-08-08 09:28:34 · 232 阅读 · 0 评论 -
P2580 于是他错误的点名开始了 - ( 字典树 )
题目链接:点击进入题目思路对于每个节点,记录以这个节点为终点的字符串的编号,查询的时候,若有返回编号,若无返回 0 ,对于重复的情况,可以用 vis 数组标记一下。代码// Problem: P2580 于是他错误的点名开始了// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P2580// Memory Limit: 125 MB// Time Limit: 1000 ms// // Powered by CP Ed原创 2021-08-08 09:27:12 · 210 阅读 · 0 评论 -
HDU - 1251 - 统计难题( 字典树 )
题目链接:点击进入题目思路字典树,对于每个节点,记录一个以该节点为前缀的字符串数目 sum ,在插入的时候,每经过一个存在的节点,该节点 sum++ ,若该节点不存在,创建节点后,sum 赋初值 1代码// Problem: 统计难题// Contest: Virtual Judge - HDU// URL: https://vjudge.net/problem/HDU-1251// Memory Limit: 131 MB// Time Limit: 2000 ms// // P原创 2021-08-08 09:26:53 · 490 阅读 · 0 评论 -
HDU - 6988 - Display Substring ( 二分 + 后缀数组 )
题目链接:点击进入题目题意给你 26 个小写英文字母的各自价值,给你一个字符串,在所有不同的子串中,求第 k 小的子串权值。思路二分答案,用后缀数组来 check 二分值 mid 。具体 check :遍历后缀数组,对于后缀的所有前缀,它们的权值是递增的,可以再次二分求此后缀中权值小于等于 mid 的所有前缀数量 ( 这里可以用前缀和求前缀的权值 )。这里注意,因为会有重复的子串,也就是会重复将某些前缀计入答案,所以我们还要减去重复计算的部分。这里可以使用 height 数组,height原创 2021-07-29 21:26:36 · 272 阅读 · 0 评论 -
P4173 残缺的字符串 - ( 通配符的单模式串匹配 && FFT )
题目链接:点击进入题目思路学习链接普通串匹配过程,大致思路:1、定义匹配函数2、定义完全匹配函数3、快速计算每一位的完全匹配函数值代码#include<iostream>#include<string>#include<map>#include<set>//#include<unordered_map>#include<queue>#include<cstdio>#include<ve原创 2021-07-28 15:56:56 · 163 阅读 · 0 评论 -
HDU - 6975 - Forgiving Matching ( FFT字符串匹配 )
题目链接:点击进入题目题意给你两个字符串 S 、T ( 只包含 字符 0 - 9 以及 * ), S 长 n , T 长 m , * 是通配符( 即可以与任何字符匹配 ),问在匹配中最多允许 k( 0 - m )个不同位置的情况下,S 中最多有多少个能与 T 匹配的子串。思路对于 S 的所有长度为 m 的子串,维护一个 f 记录这个子串与 T 匹配的位置数,知道了 f 也就是知道了这个子串完全匹配所需要的最小的 k 。假如没有通配符,对于每个字符 c ,原创 2021-07-28 15:15:14 · 399 阅读 · 0 评论 -
AC自动机模板
学习链接:点击进入功能解决多对字符串之间的相互匹配问题fail指针fail是失配指针,如果此时匹配失败,那么,我们就要到达这个指针指向的位置继续常数匹配fail [ i ] 为与以 i 节点为结尾的串的后缀有最大公共长度的前缀的结尾编号,也就是说fail指针指向的节点所代表的串,是最长的、能与后缀匹配的,且在Trie中出现过的前缀所代表的节点。代码const int maxn=1e6+10;int trie[maxn][26]; //字典树int sum[maxn]; //记原创 2021-07-07 12:16:01 · 132 阅读 · 0 评论 -
2014-2015 ACM-ICPC, Asia Xian Regional Contest - G - The Problem to Slow Down You ( 回文树 )
题目链接:点击进入题目题意给你两个字符串,让你求相等的回文子串的对数思路对两个字符串建两棵回文树,我们知道回文树中 next [ i ] [ j ] : 编号为 i 的回文串两边加上字符 j 所形成的回文串的编号。根据 next 数组,我们可以分别从两棵树的 偶数根 和 奇数根 同时 dfs 找两个字符串相同的回文子串,同时计入答案。代码// #pragma GCC optimize("Ofast","inline","-ffast-math")// #pragma GCC target原创 2021-06-15 19:53:53 · 143 阅读 · 0 评论 -
黑暗爆炸 - 2160 - 拉拉队排练( 回文树 )
题目链接:点击进入题目题意求给定字符串的长度为奇数的回文子串中长度排前名前 k 的回文串的长度之积,若没有 k 个输出 -1思路对字符串建回文树,建完遍历除两个根节点以外的其它所有节点,记录节点对应回文串的长度以及数量( 只记录奇数长度的即可 ),剩下的就是长度从大到小取 k 个求乘积。代码// #pragma GCC optimize("Ofast","inline","-ffast-math")// #pragma GCC target("avx,sse2,sse3,sse4,mmx原创 2021-06-15 19:53:37 · 185 阅读 · 0 评论 -
CodeForces - 17E - Palisection ( 回文树 )
题目链接:点击进入题目题意对一个给定字符串,求有多少对回文子串有交集思路求出这个字符串所有回文子串的对数,然后 所有的 - 无交集的 = 有交集的。求所有的:顺序建立回文树,用 sum 数组,通过前缀和,来维护前 i 位总共有多少回文串。顺序枚举每个位置,以当前位置为末尾的回文串个数 cnt 乘 当前位置之前的回文串个数 sum [ i - 1 ] ,加上当前位置自身的贡献 cnt * ( cnt -1 ) / 2 ,累加答案 ans1 。求无交集的:逆序建立回文树,逆序枚举每个原创 2021-06-13 21:20:24 · 226 阅读 · 0 评论 -
黑暗爆炸 - 2565 - 最长双回文串 - ( 回文树 )
题目链接:点击进入题目题意求最长双回文串 T 的长度,T = X + Y( X、Y是回文串 )思路我们可以枚举中间点,求 中间点左边回文串的长度与中间点右边回文串的长度之和 ,取最大值。对于求以字符 s [ i ] 为结尾的最长回文串长度,我们可用回文树来求, 每次插入完一个新字符,此时的 len [ last ] 就是以新插入字符结尾的最长回文串的长度。对于字符串,如果正着建树,len 数组 表示的是新插入字符是右结尾,反着建树,len 数组 表示就的是新插入字符是左结尾。所以对于给定字符原创 2021-06-13 21:20:00 · 146 阅读 · 0 评论 -
回文树 - 模板
学习链接:点击进入介绍回文树通常用来解决一些回文串问题空间复杂度 O( N * 字符集大小 )时间复杂度 O( N * log( 字符集大小 ))功能求串 S 前缀 0 ~ i 内本质不同回文串的个数(两个串长度不同或者长度相同且至少有一个字符不同便是本质不同)求串 S 内每一个本质不同回文串出现的次数求串 S 内回文串的个数求以下标 i 结尾的回文串的个数存储len [ i ] 表示编号为 i 的节点表示的回文串的长度(一个节点表示一个回文串)next原创 2021-06-13 21:19:38 · 311 阅读 · 0 评论 -
URAL - 1960 - Palindromes and Super Abilities - ( 回文树 )
题目链接:点击进入题目题意每次添加一个字符,问当前字符串本质不同的回文子串有多少个?思路回文树模板。建树的时候,除去一开始建立的 0 、1 两个根节点,剩下的,每当添加一个新字符,同时新字符与之前添加的字符会形成新的回文串的时候,才会创建新的节点,所以判断每添加一个新节点,字符串会存在多少个不同的回文子串,直接输出 此时的回文树节点数 - 2 即可( 减去两个根节点 )代码// #pragma GCC optimize("Ofast","inline","-ffast-math")//原创 2021-06-11 14:38:21 · 150 阅读 · 0 评论 -
P5357 【模板】AC自动机(二次加强版)
题目链接:点击进入题目思路AC自动机在暴跳 fail 指针的时候,有时会被类似aaaaaaaaaaaa… …的串卡复杂度,所以就需要对原先的查询进行优化。 我们可以建出 fail 树,记录自动机上的每个状态被匹配了几次,最后求出每个模式串在 trie 上的终止节点在 fail 树上的子树总匹配次数就可以了。代码// #pragma GCC optimize("Ofast","inline","-ffast-math")// #pragma GCC target("avx,sse2,sse3,s原创 2021-06-10 18:48:53 · 200 阅读 · 0 评论 -
P3796 【模板】AC自动机(加强版)
题目链接:点击进入题目思路和 简单版本 的那个模板题差不多,只需要把记录答案的修改成分组记录答案计即可。代码// #pragma GCC optimize("Ofast","inline","-ffast-math")// #pragma GCC target("avx,sse2,sse3,sse4,mmx")//#pragma GCC optimize(3)//O3//#pragma GCC optimize(2)//O2//#include<bits/stdc++.h>原创 2021-06-10 18:48:44 · 123 阅读 · 0 评论 -
P3808 【模板】AC自动机(简单版)
题目链接:点击进入题目思路根据给的子串( 模式串 ),建立 trie,得到 fail 数组,剩下的就是将待查询母串( 文本串 )扔进自动机里查询了。( AC自动机模板 )代码// #pragma GCC optimize("Ofast","inline","-ffast-math")// #pragma GCC target("avx,sse2,sse3,sse4,mmx")//#pragma GCC optimize(3)//O3//#pragma GCC optimize(2)//原创 2021-06-10 18:48:27 · 130 阅读 · 0 评论 -
HDU - 2222-Keywords Search(AC自动机)
题目链接:点击进入题目题意求给定单词在文章中出现的次数思路AC自动机模板代码#include<iostream>#include<string>#include<map>//#include<unordered_map>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<algor原创 2021-03-06 10:09:31 · 206 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4-B-武辰延的字符串( 扩展kmp / 二分+哈希)
题目链接:点击进入题目:思路1通过题目可以知道,满足条件的前缀对可以由 两个字符串的公共前缀 与 字符串 t 的一个后缀与模式串 s 的公共前缀 组成 ,也就可以转换成求字符串 t 的extend数组的问题,最终的前缀对总和,可以通过枚举 s和 t 的所有相同前缀 si 然后将 ti 对应的 extend 数组计入答案即可。代码1#include<iostream>#include<string>#include<map>#include<原创 2021-03-05 17:51:24 · 160 阅读 · 0 评论 -
Best Reward-(扩展kmp)
题目链接:点击进入题目题意一个字符串,由26个小写英文字母组成, 每个字母都有各自的价值, 要你将一个字符串切成两个子串, 总价值为两个串价值和, 若是回文, 则串的价值为每个字母价值和, 否则为0,问最大价值多少。思路将原串逆序,然后原串与逆序串相互ekmp匹配;对逆串枚举分割点,同时判断逆串分隔的两部分是否回文(根据extend数组判断),价值相加,循环取最大值代码#include<iostream>#include<string>#include<m原创 2021-03-05 17:51:14 · 177 阅读 · 0 评论