
后缀数组
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
【POJ2774】后缀数组 / Hash+二分
POJ2774 链接 题意求两个串的最长公共子串,我们可以把两个串用一个特殊字符拼接,然后跑SA求出heightSA求出heightSA求出height,由于最长公共子串肯定是heightheightheight中的某一个,而且要满足sa[i]和sa[i−1]sa[i]和sa[i−1]sa[i]和sa[i-1]分别属于两个串,所以只要跑一遍后缀数组遍历一遍heightheightheight就...原创 2018-05-17 02:06:53 · 385 阅读 · 0 评论 -
【POJ3450】后缀数组+二分
POJ3450 链接 题意为求多个串的最长公共子串,参考上题的做法,我们可以用特殊字符对所有字符串进行拼接,但是问题在于如果找到这个最长公共子串。数据量为n<4000len<200n<4000len<200n2−n2−n2-n遍历height数组,如果有某一段连续的区间heightheightheight数组均大于midmidmid,而且这段区间拥有来自nnn个串的后缀...原创 2018-05-17 02:08:29 · 513 阅读 · 0 评论 -
【POJ3294】 后缀数组+二分
POJ3294 链接 题意为给你n个字符串,求至少出现在[n2][n2][ \frac{n}{2}]个串中的最长公共子串,如果有多个全部输出。本题和上题几乎一模一样,只是要把判断条件由来自n个串改成来自[n2][n2][\frac{n}{2}]个串,注意一下存储答案的方式,如果当前二分量存在答案并且第一次访问,那么清空vectorvectorvector,如果不是第一次访问,就在vecto...原创 2018-05-17 02:09:38 · 426 阅读 · 0 评论 -
【POJ3415】后缀数组+单调栈
POJ3415 题意为给定两个字符串A和B,求长度不小于k的公共子串的个数(可以相同)这道题我们先考虑暴力的做法,我们可以将两串拼接求出heightheightheight数组,答案为所有分别属于A,B的后缀的(lcp−k+1)(lcp−k+1)(lcp-k+1)之和,我们可以n2n2n^{2}解决这个问题。但是本题的范围n2n2n^{2}是会超时的,所以我们要考虑heightheigh...原创 2018-05-17 02:10:42 · 433 阅读 · 5 评论 -
【URAL1297】后缀数组
URAL1297 题意为计算最长回文子串 类似于求两个字符串的最长公共子串,我们可以把strstrstr和逆置后的strstrstr进行拼接,类似于求最长公共子串的做法就可以了,但是由于我们利用height数组,要考虑abeaabeaabea这种情况。 URAL1297代码#include <iostream>#include <stdio.h>#includ...原创 2018-05-17 02:11:28 · 287 阅读 · 0 评论 -
后缀数组模板及简单的入门题总结
后缀数组模板:const int maxn = 1e5+5;//开总串长度int wa[maxn],wb[maxn],wsf[maxn],wv[maxn],sa[maxn];int rank[maxn],height[maxn],s[maxn];char str1[maxn],str2[maxn];//sa:字典序中排第i位的起始位置在str中第sa[i] sa[1~n]为有效...原创 2018-05-16 16:37:38 · 1961 阅读 · 4 评论 -
【POJ 3080 Blue Jeans 】 KMP/后缀数组
POJ3080 本题题意为求m个字符串长度至少为3的最长公共子串 由于m只有10而且len小于60,我们可以选择枚举某一个串的子串并用str.find()或者kmp验证是否所有该子串在所有字符串中出现过,也可以用经典的二分长度将height数组分块的后缀数组做法 POJ3080(find解法//由于只查找是否出现过,算法复杂度差距不大,所以这里给出简单一些的写法#include&l...原创 2018-05-29 20:34:31 · 232 阅读 · 0 评论 -
【POJ 3261 Milk Patterns】 后缀数组/Hash+二分
POJ3261 题意就是找一个串中至少出现过k次的最长可重叠子串。 我们用一个串构造出后缀数组,之后进行GetHeight,然后二分答案进行验证,验证的时候将height数组分块,如果连续至少k-1个height都大于当前验证值,表示答案可行。 POJ3261代码#include<stdio.h>#include<iostream>#include<...原创 2018-06-15 17:11:41 · 219 阅读 · 0 评论 -
【UVA 12338 Anti-Rhyme Pairs】 后缀数组+ST表
UVA12338 本题题意是给你n个字符串,m次查询,查询两个字符串的最长公共前缀 我们只需要把n个字符串记录下标之后进行拼接,放进后缀数组之后,然后利用st表预处理求任意两个后缀的lcp就可以了,任意两个后缀的最长公共前缀,就是求sa中两个后缀之间的height最小值。 UVA 12338代码#include<stdio.h>#include<algorithm...原创 2018-06-18 12:55:22 · 289 阅读 · 0 评论