
字符串处理
文章平均质量分 70
Frozen_Guardian
已退役菜鸡Acmer
展开
-
回文自动机模板
原理+证明的大牛博客:https://blog.youkuaiyun.com/lwfcgz/article/details/48739051const int N=1e3+100;char s[N];int n;struct Palindrome_tree{ int nxt[N][26]; int fail[N]; // 当前节点最长回文后缀的节点 int len...原创 2020-01-30 16:45:06 · 315 阅读 · 0 评论 -
后缀数组模板
详细讲解的博客:大佬的博客用法:在main函数中处理好数组s(整形),将字符串转换成整形,第len位置0,直接调用solve函数即可,solve函数中的base代表的是有多少种不同的字符,全局变量len作为字符串s的长度*suffix array*倍增算法 O(n*logn)*待排序数组长度为n,放在0~n-1中,在最后面补一个0*build_sa( ,n+1, );//注...原创 2020-01-17 23:41:17 · 328 阅读 · 0 评论 -
(转)马拉车(Manacher)算法模板
插眼:zx学长的模板马拉车算法,可以在O(n)的时间复杂度内处理出整个字符串的最长回文子串从zx学长那里白嫖的模板-_-||证明见这里:点击查看代码:供以后白嫖用const int N=1e6+100;char s[N*2];//预处理之后的字符串char str[N];//原本的字符串int p[N*2];//最长回文半径int Manacher(){ ...转载 2019-11-10 12:50:41 · 271 阅读 · 0 评论 -
(转)字典树原理+实现
字典树,高端点就是tire树,或者前缀树,其实就是一个挺简单的算法,但一直没学,昨晚上训练有涉及到,今天来突击一下,发现不是那么难先插眼一个大牛的博客(因为实在懒得复制粘贴了):https://blog.youkuaiyun.com/weixin_39778570/article/details/81990417然后就是我模仿原理自己写的string类的模板:const int N=2e3+...转载 2019-10-30 11:11:20 · 332 阅读 · 0 评论 -
(转)KMP的next数组模板
由于一个月之前看的那个博客过于详细,导致那个进阶版kmp看懂了原理但没理解代码,所以遇到题目也不会用这里挂一个通俗易懂的模板,简单还好背先上原博客链接:https://blog.youkuaiyun.com/qq_37969433/article/details/82947411写的很棒,适合没学过kmp的人学习然后就是板子:const int N=2e3+100;int nt[N]...转载 2019-10-30 11:01:56 · 305 阅读 · 0 评论 -
2021ICPC(澳门) - LCS Spanning Tree(广义后缀自动机)
题目链接:点击查看题目大意:给出一个含有 nnn 个点的无向图,点权为一个字符串,每条边的边权为相邻两点的 LCSLCSLCS,本题的 LCSLCSLCS 定义为两个字符串的最长公共子串的长度求出这个无向图中的一个生成树,使得边权之和最大题目分析:多个字符串的子串问题,考虑广义后缀自动机首先将 nnn 个字符串扔到广义后缀自动机里去,顺便记录一下每个字符串在哪些节点中出现,然后按照子串长度做最大生成树就可以了。现在问题是,如果要将每个字符串所出现的节点都表示出来,会 TLE,原因是前缀的后缀太多了原创 2022-04-03 21:36:52 · 1409 阅读 · 0 评论 -
2021ICPC(沈阳) - String Problem(后缀树+贪心)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,对于每个前缀来说,求出字典序最大的子串。题目分析:看到子串的字典序,感觉能用后缀树来做,参考了一下大佬的赛上代码: 香港中文大学(深圳)- 新手上路需要观察出本题的一个结论就是,答案一定是一个前缀的后缀,所以我们只需要求出每个答案子串的左端点即可。按照套路,对原串建立后缀树,按照字典序跑出 dfs 序 dfndfndfn,顺便维护一下每个节点首次出现的 endposendposendpos 。然后就可以用优先队列贪心了。记前缀原创 2021-11-22 18:36:57 · 1030 阅读 · 0 评论 -
2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)
题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置。如果有多个答案,输出起点最小的那个。本题规定字符串大小的比较规则如下:首先按照长度排序长度相同的情况下,按字典序排序题目大意:首先还是利用后缀自动机将后缀树建出来,此时长度为 ddd 的本质不同的子串,可以用深度为 ddd 的所有节点集合表示出来。因为后缀自动机上的边都是压缩过后的,所以每条边代表的实质上是一个连续区间的子串。所以我们需要枚举深度 ddd,利用差分数.原创 2021-11-09 18:22:44 · 1583 阅读 · 6 评论 -
HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置。如果有多个答案,输出起点最小的那个。强制在线。题目分析:后缀树的模板题,在后缀树上按照字典序前序遍历维护一下前缀和(子串个数),然后对于每次询问就可以二分查找答案在哪个节点了。那么如何求后缀树呢?其实只需要将字符串反转一下,然后扔到后缀自动机里,此时求出的 parentparentparent 树就是后缀树了。原理也十分简单,考虑 parentparentpa原创 2021-11-09 14:10:19 · 687 阅读 · 0 评论 -
CodeForces - 888G Xor-MST(贪心+字典树+最小生成树)
题目链接:点击查看题目大意:给出 nnn 个点,任意两个点之间的边权为 ai⊕aja_i\oplus a_jai⊕aj,求最小生成树题目分析:去年多校写过一样的模型,再拿出来写一遍回顾一下:牛客多校5 - Graph时间复杂度 O(nlog2n)O(nlog^2n)O(nlog2n),一层 logloglog 是字典树带着的,第二层 logloglog 是需要在子树中查询异或值最小代码:// Problem: Xor-MST// Contest: Virtual Judge - CodeFo原创 2021-08-22 17:19:00 · 261 阅读 · 0 评论 -
HDU - 7091 重叠的子串(后缀自动机+set启发式合并+树上倍增)
题目链接:点击查看题目大意:给定一个只含小写字母的字符串 sss 和 qqq 次询问,每次询问给定一个字符串,以 s[l..r]s[l..r]s[l..r] 的形式给出,判断 sss 中是否存在两个或多个出现的有重叠部分的给定子串。比如在 “ababa”“ababa”“ababa” 中,两个 “aba”“aba”“aba” 子串就重叠于中间的字母 “a”“a”“a”,而两个 “ab”“ab”“ab” 子串就没有发生重叠。TTT 组数据。题目分析:对字符串 sss 建立 SAMSAMSAM 然后建出 pa原创 2021-08-21 23:12:53 · 307 阅读 · 0 评论 -
2021HDU多校10 - 7084 Pty loves string(KMPnext树+主席树+dfs序)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,需要回答 qqq 次询问,每次询问给出一对 (x,y)(x,y)(x,y) ,意思是用 sss 的前缀 s[1:x]s[1:x]s[1:x] 和后缀 s[n−y+1:n]s[n-y+1:n]s[n−y+1:n] 拼起来后得到一个新的字符串 ttt,问 ttt 在 sss 中的出现次数题目分析:考虑对于一对询问 (x,y)(x,y)(x,y) 得到的 ttt,存在 s[l:r]=ts[l:r]=ts[l:r]=t,设断点为 x′=l+x原创 2021-08-20 21:43:59 · 530 阅读 · 1 评论 -
2021牛客多校10 - Browser Games(哈希)
题目链接:点击查看题目大意:给出 nnn 个字符串,对于每个 iii ,输出最少需要用多少个前缀,可以表示第 1∼i1\sim i1∼i 个字符串而不能表示第 i+1∼ni+1\sim ni+1∼n 个字符串题目分析:银川原题的数据加强版,正着模拟的思路被推翻,看了蒋佬队伍的代码用哈希倒着模拟的,太妙了。简单翻译一下题面就是,对于每个 iii 来说,需要在第 1∼i1\sim i1∼i 个字符串中分别找到一个前缀,满足:这 iii 个前缀去重后数量最少这 iii 个前缀不会作为前缀出现在第 i+原创 2021-08-16 21:36:18 · 877 阅读 · 3 评论 -
HDU多校4 - 6988 Display Substring(后缀自动机+二分)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,每个字母都有一个权值,现在要求所有本质不同子串中权值和第 kkk 大的权值题目分析:如果没有本质不同,那有一个很简单的二分套二分的方法,就是直接二分答案,每次枚举字符串中的每个后缀的位置作为左端点,然后二分右端点的位置,判断一下小于等于 midmidmid 的子串个数和 kkk 的关系,正确性是显然的但本题要求本质不同的子串,不难联想到后缀数据结构,我用的是后缀自动机。在后缀自动机中,每个节点代表的实质上就是一个本质不同的子串,而其原创 2021-07-30 10:38:49 · 304 阅读 · 0 评论 -
CodeForces - 528D Fuzzy Search(多项式匹配字符串)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,问字符串 sss 有哪些子串可以匹配 ttt。给出一个参数 kkk,TTT 在 SSS 的第 iii 个位置中出现,当且仅当把 TTT 的首字符和 SSS 的第 iii 个字符对齐后,TTT 中的每一个字符能够在 SSS 中找到一个位置偏差不超过 kkk 的相同字符。需要注意的是,在字符串 sss 中通过偏差匹配的字符可以重复与 ttt 匹配题目分析:预处理出数组 g[i][j]g[i][j]原创 2021-07-28 20:27:12 · 310 阅读 · 0 评论 -
HDU多校3 - 6975 Forgiving Matching(多项式匹配字符串)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt。规定 kkk 匹配的意思是,两个长度相同的字符串至多有 kkk 个位置是不同的,特别的,k=0k=0k=0 时指的就是完全匹配。现在问当 k∈[0,m]k \in[0,m]k∈[0,m] 时,字符串 ttt 可以和字符串中的多少个子串匹配题目分析:这里简单分析一下多项式匹配字符串的一般方法。设 S(i)S(i)S(i) 为字符串 sss 的每一位,同理 T(j)T(j)T(j) 为字符串 ttt原创 2021-07-28 11:04:29 · 533 阅读 · 0 评论 -
洛谷 - P4173 残缺的字符串(多项式匹配字符串-NTT)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,都含有通配符 ‘*’,现在问字符串 ttt 可以匹配字符串 nnn 的哪些位置题目分析:模糊匹配的模板题,先放两个公式:设原模式串为 AAA,匹配串 BBB,AAA 的翻转 SSSP(x)P(x)P(x) 为全匹配函数,若 P(x)=0P(x)=0P(x)=0 则称 BBB 以第 xxx 位结束的连续 mmm 位,与 AAA 完全匹配普通的单模式串匹配:P(x)=T+f(x)−f(x−m原创 2021-07-27 21:52:58 · 282 阅读 · 0 评论 -
HDU多校1 - 6955 Xor sum(字典树+贪心)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,要求找到一段长度最短的区间,使得异或和大于等于 kkk,如果有多种答案,输出左端点最小的那个题目分析:倒着维护一下后缀异或和,将后缀异或和插入字典树,然后枚举当前点为左端点,在字典树上贪心即可。设 xxx 为当前后缀值,具体贪心方法如下:如果 kkk 的当前位为 000 ,如果走异或为 111 这条路的话,答案显然会大于 kkk,所以可以直接用 111 侧的子树更新答案,同时沿着字典树走异或为 000 的这条路,因为接下来可能还是会有大于等原创 2021-07-25 21:27:11 · 264 阅读 · 0 评论 -
CodeForces - 1476E Pattern Matching(字典树+拓扑)
题目链接:点击查看题目大意:给出 nnn 个模式串和 mmm 个匹配串,题目要求输出一种模式串的排列方式,使得 mmm 个模式串从头开始匹配的话,可以匹配到相应的模式串模式串的长度不超过 444,两两互不相同,含有通配符 “_”题目分析:一开始想的是对模式串状压,模式串的每个位置都有 262626 种情况,一个模式串可以匹配 4264^{26}426 个匹配串,可以预处理哈希,但是后续的处理不太会快速建图,遂放弃看了题解后发现可以反过来想,每个匹配串若想匹配模式串,那么每个位置要么匹配原字符,要么匹原创 2021-07-21 08:31:16 · 229 阅读 · 0 评论 -
CodeForces - 1537E2 Erase and Extend (Hard Version)(扩展KMP-比较两个前缀无限循环后的字典序大小)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,现在可以执行两种操作,构造一个长度为 mmm 的字符串使得字典序最小:删除掉末尾的一个字符将字符串复制一遍并加到末尾(下文我们称之为自增)题目分析:猜结论+暴力通过 E1E1E1 后应该不难发现,答案一定是字符串 sss 的某个前缀,循环后取前 mmm 位作为答案洛谷有个大神证明了贪心的正确性,这里不多赘述,写此博客是想记录一下 jianglyjianglyjiangly 大神的结论:ainf<binf<=&g原创 2021-06-20 16:15:42 · 408 阅读 · 0 评论 -
牛客 - Elo mountains(AC自动机+可持久化数组优化)
题目链接:点击查看题目分析:初始时给出一棵以点 000 为根节点的字典树,设 arriarr_iarri 为从根节点出发到达点 iii 的字符串,需要回答对于每个 i∈[1,n]i\in[1,n]i∈[1,n] 时的 ∑k=1nf(arri,arrk)\sum_{k=1}^{n}f(arr_i,arr_k)∑k=1nf(arri,arrk),其中 f(s,t)f(s,t)f(s,t) 代表的是字符串 sss 在字符串 ttt 中出现的次数题目分析:先附上官方题解:本题难点及解决方法:字原创 2021-06-03 17:41:49 · 465 阅读 · 4 评论 -
AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)
今天遇到了一个问题,那就是如果 ACACAC 自动机的字符集很大该怎么办?比如改成 1e51e51e5 该怎么办呢?例如下题:题目来源转自(侵权删):点击查看先不考虑解法,肯定是需要用 ACACAC 自动机去解决的,但是问题是,本题中字符串的总长度可能达到 O(n2)O(n^2)O(n2) 级别,加上字符集特别大,所以遇到了很多问题不过不难看出题目中给出的实际上就是一棵 trietrietrie 树,我们可以直接在 trietrietrie 树上 getfailgetfailgetfail,就可以原创 2021-06-03 17:08:00 · 760 阅读 · 3 评论 -
牛客 - Connie(AC自动机+dp/KMP+dp)
题目链接:点击查看题目大意:给出一个匹配串 sss,现在问模式串 ttt 的期望得分。其中假设匹配串在模式串中的出现次数为 xxx,那么将得到 2x2^x2x 的分数题目分析:涉及到了期望一开始还以为是概率,后来发现其实就是个计数问题题目实际让我们操作的就是,枚举 5n5^n5n 种字符串,然后对于每种字符串统计匹配串 sss 的出现次数,注意这里的出现次数并不能说是最多或最少的出现次数,先将贡献的式子转换一下:2x=(...((1)∗2)∗2)∗2...)∗22^x=(...((1)*2)*2)*原创 2021-06-03 09:02:17 · 306 阅读 · 0 评论 -
字符串哈希模板
const int mod[]={(LL)1e9+7,(LL)1e9+9};const int base[]={233,2333};LL Hash[2][N],f[2][N];void initHash(string s) {// s=" "+s; int n=s.size()-1; Hash[0][0]=Hash[1][0]=0; for(int j=0;j<2;j++) { for(int i=1;i<=n;i++) {原创 2021-05-10 21:43:49 · 236 阅读 · 6 评论 -
CodeForces - 856B Similar Words(AC自动机+树形dp)
题目链接:点击查看题目大意:给出一个大小为 n 的字符串集记为 X,给出两个字符串相似的定义为:如果某个字符串去掉首字母可以得到另一个字符串现在需要构造一个尽可能大的字符串集,满足以下两个条件:所有的元素都是 X 中元素的前缀 任意两个元素都不能相似题目分析:因为需要构造的字符串集内的元素都是前缀,不难想到字典树,再考虑如果两个字符串是相似的,在字典树上的表现为:一个串是另一个串的 fail ,且深度恰好相差1 。回想一下 fail 指针的定义,也就是与前缀匹配的最长后缀,所以如果 fai.原创 2020-11-19 17:13:10 · 241 阅读 · 2 评论 -
CodeForces - 906E Reverses(回文自动机+Palindrome Series优化dp)
题目链接:点击查看题目大意:给出两个字符串 s 和 t,每次可以在字符串 s 中选择数个不相交的字串进行反转,问最少需要反转多少次,可以使得字符串 s 和 t 相等,输出最小反转次数以及方案题目分析:一个不太平凡的转换:构造字符串 ss = s[ 1 ] t[ 1 ] s[ 2 ] t[ 2 ] ... s[ n ] t[ n ],如果字符串 s 在反转( l , r ) 之后可以与字符串 t 匹配的话,那么新字符串 ss 中的 ( 2 * l - 1 , 2 * r ) 内的部分属于回文串.原创 2020-11-17 14:34:10 · 311 阅读 · 4 评论 -
2019ICPC(沈阳) (回文自动机+Palindrome Series优化dp)
无从追溯的一道题目。。题目大意:给出一个字符串 s,要求在 s 中选出3个互不相交的回文子串,求长度之和的最大值题目分析:考虑 n * n 的 dp,dp[ i ][ k ] 为 s[ 1 : i ] 的前缀中,选出了 j 个回文子串的最大长度,转移的话也比较简单,先对字符串建立回文自动机,枚举以点 i 为结尾的所有回文子串,设枚举到的节点为 p:k == 1:dp[ i ][ 1 ] = len[ p ] k == 2 || k == 3:dp[ i ][ k ] = max( dp[ i原创 2020-11-16 22:12:27 · 497 阅读 · 4 评论 -
CodeForces - 932G Palindrome Partition(回文自动机+Palindrome Series优化dp)
题目链接:点击查看题目大意:给出一个长度为偶数的字符串,问将其分割成 k 个子串记为 a[ 1 ] , a[ 2 ] ... a[ k ] ,且满足 a[ i ] == a[ k - i + 1 ] 的方案数是多少题目分析:一个不太容易证明的转换:问题可以等价于,构造一个新的字符串 ss = s[ 1 ]s[ n ]s[ 2 ]s[ n - 1 ] ... s[ n/2 ]s[ n/2 + 1 ],使得分割的每一部分都是偶回文串的方案数分割问题不难想到一个 n * n 的 dp,直接用回文自原创 2020-11-16 21:12:46 · 337 阅读 · 4 评论 -
SPOJ - IITKWPCE Let us play with strings(回文自动机+Palindrome Series优化dp)
题目链接:点击查看题目大意:给出一个长度为 n 的字符串,问最少拆分成多少个连续的子串,使得每个子串都是一个回文串题目分析:dp[ i ] 代表 s[ 1 : i ] 的前缀最少可以拆分成多少个连续的子串,转移公式可以描述为:利用回文自动机每次暴跳fail转移的时间复杂度是 O( n * n ) 的,可以通过此题,不过也可以利用Palindrome Series 优化成 nlogn 级别的代码:暴跳fail//#pragma GCC optimize(2)//#pragma G.原创 2020-11-16 19:46:40 · 227 阅读 · 4 评论 -
字符串科技:Palindrome Series
肝了不知道多久的串串,终于把这个东西学明白了先挂上大佬的博客:https://www.cnblogs.com/Parsnip/p/12426971.html这个东西简称我也不知道叫什么,只知道在某些方面真的比较好用先得知道一系列的前置知识,建议去阅读论文:金策_字符串算法选讲前置知识是:弱周期定理、字符串Border、Border Series和一个很重要的结论:一个回文串的所有回文后缀可以表示为 O(logn) 段等差数列然后就可以去做一些奇奇怪怪的优化了,比如对于某个前缀 s[ i原创 2020-11-16 19:22:42 · 332 阅读 · 0 评论 -
CodeForces - 17E Palisection(回文自动机/Palindrome Series优化dp)
题目链接:点击查看题目大意:给出一个长度为 n 的字符串,问有多少相交的回文子串对数题目分析:背 PAM 的时候突然发现了一道模板题,于是顺手写了。。正难则反,可以先求出有多少个互不相交的回文子串对数,参考:HDU - 5157然后用总的回文子串的匹配个数减去不相交的,就是相交的答案了注意,这个题目卡了一下内存,需要用 vector 来写 trie 树然后就是 2e6 的字符串最多有 4e12 个本质不同的子串,答案大概是 16e24 的样子,我懒得中间取模,就直接 __int128 .原创 2020-11-11 15:54:13 · 207 阅读 · 0 评论 -
洛谷 - P6292 区间本质不同子串个数(SAM+LCT+线段树)
题目链接:点击查看题目大意:给出一个长度为 n 的字符串,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 内有多少个本质不同的字符串题目分析:首先简化模型,回顾一下如何求解 “区间内有多少个不同的数” :SPOJ - DQUERY求解上面那道题目的方法可谓是五花八门,我们采用其中一种离线的方式:先将所有的询问储存下来,按照右端点 r 排序后,每次对于重复出现的数字,用线段树维护其最后一次出现的位置,那么答案就是 [ l , r ] 中元素的个数了对于这个题目而言,将每个本质不同原创 2020-10-30 22:30:26 · 1499 阅读 · 0 评论 -
洛谷 - P3975 [TJOI2015]弦论(后缀自动机)
题目链接:点击查看题目大意:给出一个字符串 s,再给出一次询问,询问分为两种类型:0 k:如果不同位置的相同子串算作一个,求第 k 小的子串 1 k:如果不同位置的相同子串算作多个,求第 k 小的子串题目分析:温故而知新,稍微总结一下这次重学 SAM 的一点小收货吧:SAM 中的连边只有两种,一种是 trie 图上的,一种是 parent 树上的,前者是 DAG,后者是树 一般看到 SAM 会配合基数排序然后倒着维护答案,这个过程实际上模拟的是在 parent 树上的 dfs,更直观的理解原创 2020-10-30 16:24:24 · 266 阅读 · 0 评论 -
CodeForces - 1437G Death DBMS(AC自动机fail树上树链剖分建线段树/暴跳fail)
题目链接:点击查看题目大意:给出 n 个模式串,每个模式串初始时的权值为 0,然后有 m 次操作:1 i x:将第 i 个模式串的权值修改为 x 2 s:给出一个字符串 s,询问字符串 s 作为主串时,所有可以与其匹配的模式串中,权值的最大值题目分析:记录一下第一次单切 div2 的 G 题吧,不知道是 cf 题目质量变捞了还是我变强了,比赛结束前 20 分钟看到 G 出的比 F 还多,反正在挂机也是无聊,就开了 G 题,发现就是 AC 自动机的裸题,写了一发暴跳 fail 的代码,交上去果不其原创 2020-10-28 10:23:48 · 587 阅读 · 0 评论 -
2020CCPC(威海) - Caesar Cipher(线段树+哈希)
题目大意:给出一个长度为 n 的序列,接下来有 m 次操作,每次操作分为下列两种类型:1 l r:区间 [ l , r ] 内的所有数都加 1 并对65536 取模,也就是 i ∈ [ l , r ] ,有 a[ i ] =( a[ i ] + 1) % 65536 2 x y len:查询两段区间 [ x , x + len - 1 ] 和 [ y , y + len - 1 ] 内的序列是否相同题目分析:第一种操作可以转化成区间更新,第二种操作可以转换成区间查询和哈希,所以不难想到使用线...原创 2020-10-26 16:07:08 · 745 阅读 · 1 评论 -
CodeForces - 1417E XOR Inverse(字典树求逆序对+分治)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a,现在要求选出一个 x,将 a 中的每个元素都异或之后得到一个新的数列 b,要求数列 b 的逆序对最小,问最小的逆序对是多少,x 该如何选择题目分析:才知道字典树上分治也可以求逆序对,时间复杂度是 nlogn 的,做法如下:将每个数都插入到字典树中,记录一下其下标 对于某个节点来说,其左子树中的点一定小于其右子树中的点 所以遍历一遍左子树中的点,双指针找一下右子树中有多少个点的下标大于当前枚举的点,累加起来就是逆序对的个数了因为每一原创 2020-10-13 16:40:12 · 382 阅读 · 1 评论 -
牛客 - Shortest Common Non-Subsequence(dp+序列自动机)
题目链接:点击查看题目大意:根据最长公共子序列抛出一个新定义,“ 最短非公共子序列 ”,假设给定了字符串 s1 和 s2,设 s 为 s1 和 s2 的“最短非公共子序列”,那么 s 需要满足:s 不是 s1 的子序列 s 不是 s2 的子序列 满足上述两个条件下,s 尽可能短现在给出两个 01 串,输出其“最短非公共子序列”,如果有多个答案,输出字典序最小的题目分析:动态规划问题,因为题目中存在着字典序最小的这个限制,此类问题可以参考:CodeForces - 1341D所以可以反向原创 2020-10-07 22:00:39 · 646 阅读 · 0 评论 -
CodeForces - 1422E Minlexes(dp+字符串)
题目链接:点击查看题目大意:对一个长度为 n 的字符串 s 来说,可以进行的操作如下:选出一个二元对 ( i , i + 1 ) 满足 i >= 0 && i + 1 < n s[ i ] == s[ i + 1 ] 可以将 s[ i ] 和 s[ i + 1 ] 一起删除现在给出一个字符串,要求对其 n 个后缀分别进行操作,使得操作后的字典序最小题目分析:首先抛开题目,只看输入输出的话,题目对于输出是有点小要求的,所以可以自己手写一个结构体来满足要求,算是一原创 2020-10-06 19:45:37 · 431 阅读 · 0 评论 -
HihoCoder - 1877 Approximate Matching(AC自动机+dp)
题目链接:点击查看题目大意:给出一个长度为 n 的 01 字符串,规定近似相等的定义是,两个长度相同的字符串,至多只有一个位置不相同,问长度为 m 的 01 串中,有多少个字符串,存在一个长度为 n 的子串,使得其与给定的字符串近似相等题目分析:首先可以与给定的长度为 n 的字符串进行近似相等的字符串至多有 n + 1 个,分别是其本身,以及每个位置置反后得到的新的字符串,那么这个题目正难则反,我们可以用 AC自动机 配合 dp 求出长度为 m 的字符串有多少种不能和给定的字符串近似相等,那么最终答原创 2020-09-17 08:19:45 · 324 阅读 · 0 评论 -
CodeForces - 1252D Find String in a Grid(AC自动机)
题目链接:点击查看题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a个单位,再向下 b 个单位所得到的路径上的字符串,a 和 b 可以等于 0 ,也就是至多存在一次拐角,如样例的 ABC:题目分析:官方题解的做法是后缀数组+树状数组,但过于复杂,看不懂,民间题解是AC自动机,这里讲一下AC自动机怎么做吧首先 n 和 m 是 500 的,我们如果枚举每个起始位置是 n * n 的..原创 2020-08-31 12:16:01 · 420 阅读 · 0 评论