#include<bits/stdc++.h>#defineR register intusingnamespacestd;constintN=1e6+9;intsa[N],rk[N],hei[N],x[N],y[N],c[N];chars[N];voidRsort(R n,R m){for(R i=1;i<=n;++i)++c[x[i]];for(R i=2;i<=m;++i)c[i]+=c[i-1];for(R i=n;i;--i)sa[c[x[y[i]]]-...
定义:LCP(a,b)为排名为a,b两个后缀的最长公共前缀 证明1:LCP(i,k)=min(LCP(i,j),LCP(j,k)),(i<=j<=k) sa[i]和sa[j]的前LCP(i,j)个字符相等,sa[j]和sa[k]的前LCP(j,k)个字符相等,所以LCP(i,k)不会小于右式。 然后(skyh:显然。)因为后缀们已经被排好序,所以不存在形如⎧⎪...
第一题后缀数组 不想写下去了……(快哭了TNT) 这题在BZOJ上内存很容易开过(5人组-》TLE/CE/MLE/RE/AC) 大家要是这题RE把数组开小点。别忘了[RMQ*20]数组+数组之和 //省空间 #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #inclu...
Problem:问题描述与上题基本相同,但是要求重复子串的出现位置不可重叠。 Solution:考虑二分答案,把求值的问题变成判断是非的问题。假设二分得到k,我们按照sa数组的顺序把height大于等于k的后缀分成一组,如下图。 分组过后,我们发现每一组的任意两个后缀的最长公共前缀都是大于等于k的。这时,我们只要判断是否存在一组...
第一题后缀数组 不想写下去了……(快哭了TNT) 这题在BZOJ上内存很容易开过(5人组-》TLE/CE/MLE/RE/AC) 大家要是这题RE把数组开小点。别忘了[RMQ*20]数组+数组之和 //省空间 #include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#include<cmath...
后缀数组来啦! 前两期,我们重点介绍了后缀数组中sa、rank、height数组的求法。这些数组都具有优秀的性质,我来向大家介绍几种后缀数组在解决单字符串问题上的经典应用。 最长重复子串(可重叠) Problem:若字符串A在字符串B中出现两次及以上,则称A为B的重复子串。给定字符串S,求S中出现位置可重叠的最长重复子串的...
kuangbin后缀数组 - I题 POJ3415 单调栈解法 题意,给出两个字符串,给一个k,求出满足a的字串与b的子串完全一样的长度>=k的所有情况的数量。 翻译一下题意就是求所有后缀中,lcp>=k的即可。 我们拼接两个字符串,中间用不出现的字符隔开即可。 然后就是如何求解的问题。
题意:给两个串A、BA、B,问你长度>=k>=k的有几对公共子串思路:先想一个朴素算法: 把BB接在AA后面,然后去跑后缀数组,得到heightheight数组,那么直接rmqrmq就能O(1)O(1)得到任意两个AA和BB的LCP。如果LCP>=kLCP>=k,那么这个串的贡献对数为LCP−k+1LCP−k+1。但是这样遍历显然超时。
[maxn];//SA数组,表示将S的n个后缀从小到大排序后把排好序的 //的后缀的开头位置顺次放入SA中 int t1[maxn],t2[maxn],c[maxn];//求SA数组需要的中间变量,不需要赋值 int rk[maxn],height[maxn]; //待排序的字符串放在s数组中,从s[0]到s[n-1],长度为n,且最大值小于m, //除s[n-1]外...
BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ) 3172: [Tjoi2013]单词 Time Limit:10 SecMemory Limit:512 MB Submit:268Solved:145 [Submit][Status] Description 某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文...