随笔分类 - 后缀数组
摘要:后缀数组,还是对height数据进行分组。然后二分答案。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 const int maxn=20000+10; 7 int num[maxn]; 8 int sa[maxn],t[maxn],t2[maxn],c[maxn],height[maxn],rank[maxn]; 9 map a;10 int n,K;11 void build_sa(int m...
阅读全文
摘要:若序列ai,ai+1,ai+2,ai+k-1,和aj,aj+1,aj+2,..aj+k-1,满足要求,那ai+1-ai==aj+1-aj,以此类推。所以对原序列进行处理,得到有n-1个元素的序列b,bi代表ai+1-ai的值,那么原问题就转化为了不可重叠最长重复子串。二分结果值k,看是否存在两个长度为k的子串相同,并且不重叠。也就是看是否存在一对后缀,这两个后缀的LCP大于等于k,并且编号差值>=k。把根据height数组分组,得到的每组任意两个后缀的LCP>=k,并且是封闭的,任意一对后缀满足LCP大于等于k的后缀都分别属于这几组,即分了类,然后看每一类中是否至少存在一对。即求出
阅读全文
摘要:用的是后缀数组,对于串s1,s2求最长公共子串,最原始的想法就是比较两个串的所有后缀之间的最长公共前缀,可有通过后缀数组优化,先把s1,s2连起来,中间加一个不在s1,s2中的任意一个字符。这样,新形成的串的后缀可以分为两类,一类是包含s1中字符的后缀,一类就是不包含s1中字符的后缀,最后的结果也就是这两类后缀之间的最长公共前缀。额外添加的那个字符的作用就体现于此,这两类后缀的最长公共前缀,也就是s1和s2之间的最长公共前缀,因为这两类后缀的最长公共前缀,肯定在额外添加的那个字符之前就已经匹配结束了,理由显而易。然后接下来就是求这两类后缀的最长公共前缀,只要在得height数组时,比较一下就可
阅读全文

浙公网安备 33010602011771号