转博客大法好 自己画一画看一看,就会体会到这个设置关键点的强大之处了. CODE(sa) O(nlogn)→1436msO(nlogn)\to 1436msO(nlogn)→1436ms #include <bits/stdc++.h> using namespace std; typedef long long LL; template<class T>inline void read(T &num) { register char ch; register int fl…
首先要差分+离散化. 然后就是求形如ABA的串有多少,其中B的长度确定为k. 我们用到了设置关键点的思想.我们枚举A的长度L.然后在\(1,1+L,1+L*2,1+L*3...\)设置关键点.然后我们枚举这些关键点,试图求出跨过这个关键点的长度为L的在B左边的A有多少个. 可以证明这样可以做到不重不漏,因为A的长度为L至少跨过一个关键点. 然后这个点的贡献就怎么算?我们先处理出后缀数组.然后对枚举的关键点i和i+L+k求LCP和LCS.贡献就是(min(LCP,L)+min(LCS,L)-1)-…
https://www.lydsy.com/JudgeOnline/problem.php?id=2119 题意:将给定数组差分后,求ABA形式的字串个数,要求|B|=m,|A|>0 1.后缀数组求出 差分序列 和 翻转差分序列后的序列 的sa,rk,height 2.枚举len=|A|,对差分序列每len个分一块,记每一块的关键点位块内第一个元素 3.枚举每一个关键点i,令j=i+len+m,求出若i作为A的最后一个元素,向左能延伸最远点x,若i作为A的第一个元素,向右能延伸的最远点y 那么i…
2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 404  Solved: 188 Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A部分的股价和C部分的股价的走势如出一辙.通过这个观…
[题目链接] http://www.spoj.com/problems/REPEATS/en/ [题目大意] 求重复次数最多的连续重复子串的长度. [题解] 考虑错位匹配,设重复部分长度为l,记s[i]和s[i+l]前缀匹配得到的最长长度为r,枚举所有的l和i,得到r,那么答案就是r/l+1的最大值.计算任意后缀的最长公共前缀可以利用后缀数组+ST表来解决,两个后缀的最长公共前缀就是他们名次之间的h数组的最小值. 显然,枚举i和l的复杂度达到了O(n2),是没有办法完成统计的,我们发现每个区段只…
[题目链接] poj.org/problem?id=3693 [题目大意] 求一个串重复次数最多的连续重复子串并输出,要求字典序最小. [题解] 考虑错位匹配,设重复部分长度为l,记s[i]和s[i+l]前缀匹配得到的最长长度为r, 枚举所有的l和i,得到r,那么答案就是r/l+1的最大值. 计算任意后缀的最长公共前缀可以利用后缀数组+ST表来解决, 两个后缀的最长公共前缀就是他们名次之间的h数组的最小值. 显然,枚举i和l的复杂度达到了O(n2),是没有办法完成统计的, 我们发现每个区段只会存…
BZOJ_4516_[Sdoi2016]生成魔咒_后缀数组+ST表+splay Description 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2,1] 时,它的生成魔咒有 [1].[2].[1,2].[2,1].[1,2,1] 五种.S=[1,1,1] 时,它的生成魔咒有 [1]. [1,1].[1,1,1] 三种.最初 S 为空串.共进行 n…
后缀数组+ST表. 代填的坑. \(Code\ Below:\) #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=100000+10; int n,m,L,h[maxn],Min[maxn][18],sa[maxn],tax[maxn],rnk[maxn],tp[maxn]; char s[maxn];ll ans; void SA(){ int i,k,p;m=128; for…
2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 331  Solved: 153[Submit][Status][Discuss] Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A…
2119: 股市的预测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 434  Solved: 200[Submit][Status][Discuss] Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2119 题解: 这个题很好的. 首先把序列转化为差分序列,问题转化为找到合法的子序列,使得去除最中间的 M长度,剩下的头尾完全相同. 枚举重现的长度 len,然后在序列中每len个长度打一个标记,不难发现,如题所述的A部分一定只包含一个标记点.然后枚举每个被标记的点 i,得到对应的 j=i+len+M,然后求出 i和 j 向前向后可匹配的最大长度 L,R那么对答案的贡献即为 max(0,(m…
Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工 具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股 票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A部分的股价和C部分的股价的走势 如出一辙.通过这个观测,墨墨认为他可能找到了一个预测股票未来走势的方法.进一步的研究可是难住了墨墨, 他本想试图统计B部分的长度与发生这种情况的概率关系,不过由于数据量…
Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i)…
Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Accepted: 2915 Description The repetition number of a string is defined as the maximum number R such that the string can be partitioned into R same conse…
4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] Description 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个,并在选出来的 k 个子串中选择字典序最大的那一个.他称其为“魔力串”. 现在他想找一个最…
[题目链接] http://acm.timus.ru/problem.aspx?num=1297 [题目大意] 求最长回文子串,并输出这个串. [题解] 我们将原串倒置得到一个新的串,加一个拼接符将新串拼在原串的后面, 那么枚举对称的中心点, 在两个串在组合成的串的对应位置的后缀的最长公共前缀 就是该点像两边扩展的最长回文子串的一半长度. 那么如何求任意两个后缀的最长公共前缀呢,考虑后缀数组的h数组和rank数组, 我们可以发现,两个后缀的最长公共前缀就是他们名次之间的h数组的最小值. 对h数组…
[题目链接] http://acm.hust.edu.cn/vjudge/problem/27647 [题目大意] 给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串.并输出这个回文串. [题解] 用拼接符将原字符串倒序相接,做一遍后缀数组,查询两串相应位置的LCP就是以该点为中心的回文串长度的一半分,奇偶求出所有后缀回文串,保留最长的,则补充部分为剩下的前缀的倒置.至于查询两串的LCP我们可以在height数组建立ST表查询. [代码] #include <cstdio> #…
The repetition number of a string is defined as the maximum number \(R\) such that the string can be partitioned into \(R\) same consecutive substrings. For example, the repetition number of "ababab" is 3 and "ababa" is 1. Given a stri…
Description 给定两个串A,B.请问B中有多少个非空子串和A的编辑距离不超过K? 所谓“子串”,指的是B中连续的一段.不同位置的内容相同的子串算作多个. 两个串之间的“编辑距离”指的是把一个串变成另一个串需要的最小的操作次数, 每次操作可以插入.删除或者替换一个字符. Input 第一行一个非负整数K.接下来两行,每行一个由大写字母组成的字符串,分别表示A和B. Output 输出一行一个整数,表示所求答案. Sample Input 1 AAA AABBAAB Sample Outp…
[题目链接] click [题目大意] 给出一些字符串,询问查询任意两个字符串的最长公共前缀 [题解] 将字符串拼接,对拼接的字符串做后缀数组,对于查询的两个字符串, 只要在height数组上查询区间最小值即可. 特别注意多组数据时候对字符串结尾的处理,很久没写容易忽视导致wa. [代码] #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=…
题意 求区间l,r的子串在原串中第k次出现的位置. 链接:https://vjudge.net/contest/322094#problem/C 思路 比赛的时候用后缀自动机写的,TLE到比赛结束. 学了后缀数组后,发现这题用后缀数组写还简单些. 我们把样例aaabaabaaaab后缀排序后列出来: 比如我们的l,r,k为2,3,2,那么先找到2,3表示的子串为aa,后缀数组的height数组表示的是相邻两个后缀(排序后)的最长公共前缀长度,往这个方向去想,[l,r]这个子串肯定是某个后缀的前缀…
传送门 很容易想到,题目中的相同是指差分数组相同. 那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数 双指针移动,用st表维护height数组中的最小值. 当然用单调队列应该也可以且更快. #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #define N 1010000 using namespace std; int n, m, t, cn…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键点就是块的开头: 那么每一种 ABA 的串,A 的部分一定覆盖了一个关键点: 所以找关键点周围的匹配长度算答案,具体就是找和对应位置的 lcp + lcs,那么 ABA 可以在对应匹配的地方滑动,就能找到所有 ABA 了: 因为是差分数组所以 n-1,而且注意连接正反串的字符要比串内字符小,不是 '…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 就是找差分序列上中间差 m 的相等的两段. 考虑枚举这样一段的长度 L .可以把序列分成 \( \frac{n}{L} \) 段:令 L , 2L , ... 这样的位置为关键点,那么每个关键点 i 求一下 LCP( i , i+L+m ) 和 LCS( i , i+L+m ) ,就能知道过这个关键点的左端点的合法范围.用 lst 记录上一个关键点算出的右端点来去重即可. 这样是 n…
题目大意:求一个字符串中形如$ABA$的串的数量,其中$B$的长度是给定的 有点像[NOI2016]优秀的拆分这道题 先对序列打差分,然后离散,再正反跑$SA$,跑出$st$表 进入正题 $ABA$串有一个神奇的性质 令$A$串长度是$x$ 如果我们选取了一个位置$i$,再选取一个位置$i+x+m$ 用预处理的$st$表,求出经过它们的,最长的相同子串的起始位置$s$和结束位置$e$ 合法的$ABA$串似乎在$[s,e]$之间滑动 有了这个性质,我们再外层枚举长度$x$,在序列中找出一些相隔为$…
Description 墨墨的妈妈热爱炒股,她要求墨墨为她编写一个软件,预测某只股票未来的走势.股票折线图是研究股票的必备工具,它通过一张时间与股票的价位的函数图像清晰地展示了股票的走势情况.经过长时间的观测,墨墨发现很多股票都有如下的规律:之前的走势很可能在短时间内重现!如图可以看到这只股票A部分的股价和C部分的股价的走势如出一辙.通过这个观测,墨墨认为他可能找到了一个预测股票未来走势的方法.进一步的研究可是难住了墨墨,他本想试图统计B部分的长度与发生这种情况的概率关系,不过由于数据量过于庞大…
把三个串加上ASCII大于z的分隔符连起来,然后求SA 显然每个相同子串都是一个后缀的前缀,所以枚举s1的每个后缀的最长和s2相同的前缀串(直接在排序后的数组里挨个找,最近的两个分别属于s1和s2的后缀的height一定是最长符合要求的前缀),然后判断一下这个子串里最早出现的和s3相同的子串的位置,这里先预处理出每个等于s3的子串的位置然后二分找(没有就直接和height取max),然后答案就是从这个后缀开头到和s3相同子串结尾的前一个位置的长度 #include<iostream> #inc…
https://www.lydsy.com/JudgeOnline/problem.php?id=3879 把所有的后缀取出,按rank排序 求出相邻两个后缀的lcp 每个后缀对答案的贡献就是 与在它之前的后缀的lcp之和 维护一个单调递增的栈,记录栈中元素的lcp之和 即可 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 500001 #def…
4453: cys就是要拿英魂! Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 46[Submit][Status][Discuss] Description pps又开始dota视频直播了!一群每天被pps虐的蒟蒻决定学习pps的操作技术,他们把pps在这局放的技能记录了下 来,每个技能用一个字符表示.经过研究,蒟蒻们发现字典序更大的连招威力更大.于是所有蒟蒻都想学习pps最 强的连招.但是他们太弱了,不能学会整个视频里的…
https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n,m,mm; char s[N]; int a[N]; int v[N]; ,k; ][N…