随笔分类 - 字符串
摘要://#include #include #include #include #include //#include //#include //#include #include #include using namespace std; int n,m,lq; #define maxn 200011 struct Edge{int to,next; char v;}edge[maxn ss[...
阅读全文
摘要:$n \leq 100000$的字符串,多次问一个区间有多少位置不同的回文串。 先插空做一次manacher,得到每个字符往左右延伸的长度$f$数组。如ACAA变*A*C*A*A*,那么所有*的$f_k$实际对应的回文串数是$\frac{f_k}{2}$(一定整除),否则是$\frac{f_k+1}
阅读全文
摘要:$n \leq 30000$的字符串,问其所有子串的所有AABB形式的拆分有多少种。$t \leq 10$组询问。 $n^3$过80,$n^2$过95,鬼去写正解。。 $n^2$:先枚举一次算每个位置结尾的AA形式的子串,再枚举一次用类似的方法算答案。 正解:类似,记每个位置结尾的AA的子串和每个位
阅读全文
摘要:$n \leq 200000$的字符串,$m \leq 200000$次操作:1,末尾加一个字符;2,末尾删一个字符;3,一个区间中,问某个串(新给的)出现次数。强制在线。 并不会。 首先可以通过$nm$的复杂度成功拿到20分。 其次可以写一个不带加字符的:建个后缀树,然后查询就是查:后缀树的一个子
阅读全文
摘要:$n \leq 500000$的01串,1跟0配,问最长回文子串。 $0=1$,$1 \neq 1$,$0 \neq 0$,然后二分哈希或manacher或回文树。 1 //#include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 //#
阅读全文
摘要:无。 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 //#include<time.h> 5 //#include<complex> 6 //#include<set> 7 //#include<queue> 8 #inc
阅读全文
摘要:$n \leq 100000$的一文本串,给$m \leq 100000$个询问,每次问一小串在文本串的哪一个最短的子串里出现指定次数。注意,询问串互不相同,且总长度$\leq 100000$。 比赛时不会分析复杂度QAQ没想到这么简单 互不相同的询问串,不同的长度会只有根号个。而每个长度的出现次数
阅读全文
摘要:$n \leq 100000$的01串(其实啥串都行),给$m \leq 100000$个询问,每次问$[L,R]$,回答:前缀$L,L+1,...,R$中,任意两个的最长公共后缀的长度。 这种前缀后缀的询问,无脑先建个后缀树先,反串的后缀树正串的sam哦。 然后现在问题就是:每次问一个区间的点集,
阅读全文
摘要:$n \leq 1000000$的字符串,对每一个子串$i$~$n-i+1$,求他最长的一个既是前缀又是后缀的子串。 这题要求的东西具有“对称性”,不充分利用难以解决。这里的“对称性”不仅指询问是对称的,更指要求的那个公共部分是对称的——不对称的相同的子串对答案没有丝毫贡献。 从贡献的角度入手,就是
阅读全文
摘要:给个串,只能用操作shift x表示把后面x个字符翻转后放到串的前面。问s串怎么操作能变t串。n<=2000,操作次数<=6100。 打VP时这转来转去的有点晕。。。 可以想一种逐步构造的方法,即从一个小的完成构造的部分通过一顿操作,在不影响这部分的前提下扩展。 好吧我看题解了,直接丢图,是从abc
阅读全文
摘要:一开始有一空串,n次操作,每次在串末尾加入一个字符问最小循环节。要求在线与可持久化。 如果只是在线的话那是很简单的,答案是!!$i-fail[i]$,其中$fail[i]$是KMP中的失配函数。 但如果可持久化的话: 一、复杂度难保,因为过程不连贯,没法用普通KMP那种复杂度的证明。 二、给出的字符
阅读全文
摘要:t<=5次询问每次问一个<=1e6的串的$\sum_{i=1}^{n} (num_i+1)$,其中num[i]表示既是前缀i的前缀又是前缀i的后缀且这两部分不重叠的子串的数量。 方法一:在KMP树上倍增!吃枣药丸+tle+制杖 方法二:开另一个数组记下每个点在KMP树中的深度,另外开一个指针记下“前
阅读全文
摘要:n<=300000的串,每一位有权<=1e9,对每个r=0~n-1问lcp长度为r的两个后缀有多少种,并在其中找出一个二元后缀使得他们开头的字符对应权值乘起来最大。 n*n*n:略 n*n*logn:哈希,略 lcp长度为指定长度我不会,但longes common suffix--最长公共后缀,这
阅读全文
摘要:n<=2000的两个串,求四个问: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短的子序列,它不是B的子序列 一开始??????嗯要识别子串和子序列需要俩东西:序列自动机和后缀自动机。 前两
阅读全文
摘要:求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀。 方法一:SA+单调栈,自行yy。 方法二:SAM构造出来,然后每个状态对答案的贡献就是:C(|right_s|,2)*(Max_s-Max_parent_s)。前面使用的变量名含
阅读全文
摘要:问两个串的最长公共子串,n<=100000。 SAM可以直接搞当然SA哈希都可以。。类似于KMP的做法,如果沿parent边走要顺势修改匹配位置。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<st
阅读全文
摘要:n<=100000个字符串,总长度<=100000,问每个字符串有多少子串至少出现在n个串中的m个。 方法一:(未写)串在一起,后缀数组搞出来,然后height数组--排名相邻两个后缀的lcp搞出来,然后可能产生贡献的就是一段连续的height。对这段连续的height,如果有区间[L,R],满足R
阅读全文
摘要:不要问我为什么,大家都啃CLJ论文过来的。 怎么会有这么强的人。。发明和引进这种算法的 诶谁看懂了CLJ的论文教我下QAQ我其实还不会的 Q:后缀树中所有节点深度和是多少?
阅读全文
摘要:n<=1e5个数字,给m<=25000个数字做模板串,给的数字都<=25,求n个数中有多少个子串满足这样的与模板串匹配:长度与模板串相同,且子串中第一、二、三、……个数字在该子串中的排名和模板串中第一、二、三、……个数字在模板串中的排名相同,如:1 4 4 2和4 6 6 5匹配。 两串匹配--KM
阅读全文
摘要:给两个长度不超过50000的串,A串可每次截连续一段复制出来,求最少复制几次能得到B串。 方法一:SAM。不会。 嗯好会了。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<stdlib.h> 5 /
阅读全文

浙公网安备 33010602011771号