字符串专题
各种字符串的题:SAM,SA,后缀平衡树,exKMP,KMP持续更新中……
SC.ldxcaicai
我很菜=_=
展开
-
codechef Favourite Numbers(二分+数位dp+ac自动机)
传送门题意:给444个整数L,R,K,nL,R,K,nL,R,K,n,和nnn个数字串,L,R,K,数字串大小≤1e18,n≤65L,R,K,数字串大小\le1e18,n\le65L,R,K,数字串大小≤1e18,n≤65问[L,R][L,R][L,R]中第KKK小的拥有nnn个数字串中至少一个串作为子串的数。思路:一看就要二分答案,现在考虑统计[L,R][L,R][L,R]中有多少个...原创 2019-02-15 15:37:51 · 160 阅读 · 0 评论 -
bzoj2865&&1396: 字符串识别(后缀自动机+线段树)
传送门卡空间差评!题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值。解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep=1的时候才对答案有贡献。于是对于每个sizep=1size_p=1sizep=1的状态分情况更新答案。pos=[pos[p]−len[link[p]]+1,pos[p]]pos=[pos[...原创 2018-12-23 14:16:29 · 316 阅读 · 0 评论 -
bzoj4516: [Sdoi2016]生成魔咒(后缀自动机)
传送门samsamsam入门题。题意简述:给出一个串让你依次插入字符,求每次插入字符之后不同子串的数量。显然每次的变化量只跟新出现的nnn个后缀有关系,那么显然就是maxlenp−maxlenlinkpmaxlen_p-maxlen_{link_p}maxlenp−maxlenlinkp。注意到字符集很大,可以用mapmapmap来维护转移边。代码:#include<bi...原创 2018-12-23 12:16:04 · 159 阅读 · 0 评论 -
关于后缀自动机的一些想法&&题目收集(持续更新中)
上周学习了后缀自动机。于是蒟蒻ldxldxldx在DZYODZYODZYO和zxyoizxyoizxyoi的引导下逐渐对samsamsam这个东西有了自己的认识。chapter1chapter 1chapter1 想法&amp;总结为啥会有samsamsam这个东西?因为samsamsam可以做到利用O(n)O(n)O(n)的时空来识别一个字串的n2n^2n2个字串。因为samsam...原创 2018-12-23 00:17:23 · 279 阅读 · 0 评论 -
bzoj3277: 串(后缀自动机+启发式合并)
传送门跟这道题是一模一样的。于是本蒟蒻又写了一遍10min1A庆祝代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int N=2e5+5;typedef long long ll;int T,k;string s[N];struct SAM{ int last,...原创 2018-12-22 16:51:11 · 299 阅读 · 0 评论 -
spoj7258 Lexicographical Substring Search(后缀自动机)
传送门samsamsam基础题。题意简述:给出一个串,询问第kkk大的本质不同的串。然而这就是弦论的简化版。我们把samsamsam建出来然后贪心选择就行了。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int N=2e5+5;int n,q,K;char s...原创 2018-12-22 16:35:24 · 211 阅读 · 0 评论 -
bzoj3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)
传送门题意简述:给出一棵trietrietrie树,每个点表示一个字符,求树上所有路径组成的不同字串数。(叶子数≤20\le 20≤20)由于有一个神奇的条件,考虑以每一个叶子为树根统计每个点到树根的字串,这样就考虑到了所有情况,于是就这样建立广义samsamsam统计答案即可。代码:#include<bits/stdc++.h>#define ri register in...原创 2018-12-22 15:07:49 · 178 阅读 · 0 评论 -
bzoj3473: 字符串(后缀自动机+启发式合并)
传送门调代码调的我怀疑人生。启发式合并用迭代写怎么都跑不过(雾换成了dfsdfsdfs版本的终于过了233.题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下字串中出现过。显然先对所有字串建一个samsamsam出来,然后对于每个状态用一个setsetset维护在哪些字串里面出现过(这个显然需要在建完parentparentparent树之后启发式合并...原创 2018-12-22 14:23:22 · 299 阅读 · 0 评论 -
bzoj3238: [Ahoi2013]差异(后缀自动机)
传送门后缀自动机好题。题意:做法:samsamsam 废话考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀。然后想到parentparentparent树上面两个串的最长公共后缀跟他们所处状态的lcalcalca有关系。于是对于每一个lcalcalca都处理出它的sizesizesize和maxlengthmax_{length}maxlength就行了。代码:#i...原创 2018-12-21 19:26:04 · 207 阅读 · 0 评论 -
hdu4641 K-string(后缀自动机)
传送门后缀自动机基础题。题意简述:支持动态在串尾插入字符,查询在串中出现超过kkk次的子串的个数。动态修改samsamsam,每次增量构造好了之后在parentparentparent树上从新建的npnpnp到根节点上没有超过kkk次的状态全部更新一遍统计答案就行。因为从npnpnp到根的出现次数是单调递增的,因此只要当前节点出现次数不少于kkk次就不用继续更新了。代码:#inclu...原创 2018-12-15 22:29:47 · 199 阅读 · 0 评论 -
spoj Substrings(后缀自动机)
传送门后缀自动机基础题。求长度为iii的子串出现次数的最大值。对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案。然后由于后缀链接将其转化成了一种树形结构,因此直接在上面树形递推即可。代码#include<bits/stdc++.h>#define ri register intusing namespace st...原创 2018-12-15 21:38:24 · 136 阅读 · 0 评论 -
bzoj3998: [TJOI2015]弦论(后缀自动机)
传送门后缀自动机基础题。求第kkk小的子串(有可能要求本质不同)直接建出samsamsam,然后给每个状态赋值之后在上面贪心选最小的(过程可以类比主席树/平衡树的查询操作)即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int N=1e6+5;int n,t,...原创 2018-12-15 21:35:15 · 175 阅读 · 0 评论 -
spoj Longest Common Substring II(后缀自动机)
传送门后缀自动机基础题。给出10个串求最长公共子串。我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;const int N=2e5+5;int T=0,n;char s[N];struct SAM{ i...原创 2018-12-15 17:05:09 · 145 阅读 · 0 评论 -
poj3415 Common Substrings(后缀自动机)
传送门后缀自动机基础题。给两个字符串,让你求长度不小于kkk的公共子串的数量。这题可以用后缀自动机解决废话考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话,从它到根的状态都会有贡献,因此我们给每个节点打一个懒标记最后再统计一次答案即可。代码:#include<iostream>#include<cstdio>#inclu...原创 2018-12-15 15:56:18 · 177 阅读 · 0 评论 -
bzoj3676: [Apio2014]回文串(后缀自动机)
传送门对原串建立一个后缀自动机,然后用反串在上面匹配。如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l,maxpos][l,maxpos]就是一个回文串。于是赶快码一波统计答案(很遗憾会wa)因为有可能原串在答案中。于是我们可以遍历其linklinklink链一直跳来更新答案。代码:#incl...原创 2018-12-15 12:03:45 · 225 阅读 · 0 评论 -
spoj1812 Longest Common Substring(后缀自动机)
传送门后缀自动机模板题。题意简述:求两个字串的最长公共子串长度。对其中一个构建后缀自动机,用另外一个在上面跑即可。代码:#include&amp;lt;bits/stdc++.h&amp;gt;#define ri register intusing namespace std;const int N=5e5+5;int n;char s[N];struct SAM{ int tot,l...原创 2018-12-15 10:36:30 · 173 阅读 · 0 评论 -
bzoj3230: 相似子串(后缀数组)
传送门后缀数组入门题。建立正反两个后缀数组算就行了。代码:#include<bits/stdc++.h>#define ri register intusing namespace std;typedef long long ll;const int N=2e5+5;int n,m,q,sa2[N],Log[N],cnt[N];ll num[N];char s[N...原创 2018-11-30 21:23:25 · 150 阅读 · 0 评论 -
spoj220 Relevant Phrases of Annihilation(后缀数组+二分答案)
传送门代码:先用特殊字符把所有字符串连接在一起。然后二分答案将sasasa数组分组。讨论是否存在一个组满足组内对于每一个字符串都存在两段不相交字串满足条件。#include<bits/stdc++.h>#define ri register intusing namespace std;const int N=2e5+5;int n,m,rk[N],ht[N],sa[...原创 2018-11-30 18:54:48 · 153 阅读 · 0 评论 -
poj3294 Life Forms(后缀数组+双指针)
传送门后缀数组经典题目。我们先把所有的字符串都接在一起。然后求出hththt数组和sasasa数组。然后对于sasasa数组跑双指针统计答案。如果双指针包括进去的属于不同字符串的数量达到了题目给出的限制我们就更新答案并不断右移左指针。如果没有达到限制就一直右移右指针。代码:#include<iostream>#include<cstdio>#includ...原创 2018-11-28 17:42:09 · 151 阅读 · 0 评论 -
poj3415Common Substrings(后缀数组+单调栈)
传送门常数实在压不下来(蒟蒻开O(3)都过不了)。但有正确性233.首先肯定得把两个字符串接在一起。相当于heightheightheight数组被height&lt;kheight&lt;kheight<k的分成了几段,统计每段的贡献。考虑段中每个heightheightheight作为最小值出现的次数就行了。于是我们用单调栈求出每个位置向左右分别能延展到的最远...原创 2018-11-24 21:19:40 · 158 阅读 · 0 评论 -
poj2774Long Long Message(后缀数组)
传送门实际上可以用后缀自动机秒掉当然后缀数组也挺好写。我们将两个字符串接在一起,为了方便中间用一个特殊字符连接。然后对新字符串求heightheightheight数组。求出来之后对所有满足sai,sai−1sa_i,sa_{i-1}sai,sai−1属于两个不同字符串的heightheightheight取最大值就行了。代码:#include<iostream>#...原创 2018-11-24 14:35:05 · 122 阅读 · 0 评论 -
spoj New Distinct Substrings(后缀数组)
传送门双倍经验(弱化版本)考虑求出来heightheightheight数组之后用增量法。也就是考虑每增加一个heightheightheight对答案产生的贡献。算出来是∑∣S∣−heighti+1−sai\sum|S|-height_i+1-sa_i∑∣S∣−heighti+1−sai代码:#include<bits/stdc++.h>#define ri reg...原创 2018-11-24 14:31:55 · 107 阅读 · 0 评论 -
2018.11.24 poj3261Milk Patterns(后缀数组)
传送门后缀数组经典题。貌似可以用二分答案+后缀数组?我自己yyyyyy了一个好写一点的方法。直接先预处理出heightheightheight数组。然后对于所有连续的k−1k-1k−1个heightheightheight的最小值取最大值即可。代码:#include<iostream>#include<cstdio>#include<algorit...原创 2018-11-24 14:28:51 · 126 阅读 · 0 评论 -
2018.11.24 poj3693Maximum repetition substring(后缀数组)
传送门后缀数组好题。考虑枚举循环节长度lenlenlen。然后考虑枚举循环节的起点来更新答案。但是直接枚举每次O(n)O(n)O(n)。考虑枚举len∗k+1len*k+1len∗k+1作为起点。然后用len∗(k−1)+1len*(k-1)+1len∗(k−1)+1和len∗k+1len*k+1len∗k+1之间的某一段有可能使循环节长度再加一。代码:#include<i...原创 2018-11-24 11:54:53 · 153 阅读 · 0 评论 -
2018.11.24 poj1743Musical Theme(二分答案+后缀数组)
传送门代码:二分答案。然后对于预处理的heightheightheight数组分成几段。保证每一段中都是连续的几个heightheightheight并且这些heightheightheight都不小于二分的值。然后查询是否有一个段中两个长度的差满足条件就行了。#include<iostream>#include<cstdio>#define ri regi...原创 2018-11-24 11:50:43 · 279 阅读 · 0 评论 -
2018.11.24 loj#111. 后缀排序(后缀数组)
传送门后缀排序模板题。终于会后缀数组了(然而只会倍增并不会DC3DC3DC3)。在这里列举几个数组的意思:sai:sa_i:sai:当前排名第iii的后缀的起始下标。rkirk_irki当前下标为iii的后缀对应的排名。sa2isa2_isa2i当前排名为iii的第二关键字对应的下标。代码:#include<bits/stdc++.h>#define ri r...原创 2018-11-24 11:46:12 · 170 阅读 · 0 评论 -
2018.10.16 NOIP模拟 长者(主席树+hash)
传送门考试的时候开始sb的以为需要可持久化trietrietrie树,发现建树时空都是O(n2)O(n^2)O(n2)的。然后发现由于每次只从原来的字符串改一个字符。因此直接主席树维护区间hashhashhash值。sortsortsort的时候在主席树上二分比大小。如果左子树hashhashhash值相同递归比右子树,否则走左子树,因为左子树的字典序的贡献更大。代码...原创 2018-10-16 14:25:33 · 299 阅读 · 0 评论 -
2018.07.20 atcoder Largest Smallest Cyclic Shift(贪心)
传送门 题意:给你x个a,y个b,z个c,显然这些字符可以拼成若干字符串,然后求这些字符串中最小表示法表示出来的最大的那一个。解法:贪心思想,用multiset维护现在拼成的字串,每次取一个最小的和一个最大的拼在一起,最后剩下的就是答案。代码如下:#include&amp;lt;bits/stdc++.h&amp;gt;using namespace std;int a,b,c;multise...原创 2018-07-20 14:42:50 · 391 阅读 · 0 评论 -
2018.07.17 后缀自动机模板(SAM)
洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写。代码如下:#include&lt;bits/stdc++.h&gt;#define N 2000005#define ll long longusing namespace std;char s[N];int a[N],siz[N],n,tot[N],root=1;ll ans=0;str...原创 2018-07-17 14:20:50 · 545 阅读 · 0 评论 -
2018.07.17 牛奶模式Milk Patterns(二分+hash)
传送门 好的一道简单字符串。这里收集了几种经典做法:SAM,不想写。后缀数组+二分,不想写后缀数组+单调队列,不想写hash+二分,for循哈希,天下无敌!于是妥妥的hash代码如下:#include&amp;lt;bits/stdc++.h&amp;gt;#define N 20005#define Base 20001using namespace std;inline int...原创 2018-07-17 14:34:21 · 287 阅读 · 0 评论 -
2018.07.17 HAOI2016 找相同字符(SAM)
传送门 就是给两个字符串,让你求公共字串的个数。 本来大佬们都是用的广义后缀自动机,但我感觉后缀自动机已经可以做这道题了。我们对其中一个字串建出后缀自动机,然后用另外一个后缀自动机在上面统计贡献即可。代码如下:#include&lt;bits/stdc++.h&gt;#define N 400005#define ll long longusing namespace std;...原创 2018-07-17 15:38:51 · 206 阅读 · 0 评论 -
2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现。首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头尾。然后开始逐位比较,当两个字串同一位置的字符不同时,相对来说字符值较大的指针跳到失配下标的后面一位,如果此时两个指针重合,将其中一个加一。边界条件:两个指针中有一个值大于原数组长度。代码如下...原创 2018-07-17 14:30:17 · 130 阅读 · 0 评论 -
BZOJ 2342: [Shoi2011]双倍回文(manacher)
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB DescriptionInput 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容。Output 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文子串不存在,则输出0。Sampl...原创 2018-06-30 10:48:39 · 177 阅读 · 0 评论