字符串==后缀数组
Helium_wild
这个作者很懒,什么都没留下…
展开
-
P3809 后缀数组板子
题目#include<cstdio>#include<iostream>#include<cstring>#define m(a,b) memset(a,b,sizeof a)using namespace std;typedef long long ll;const int N=1e6+5;char s[N];int x[N],y[N],c...原创 2019-07-26 15:02:40 · 120 阅读 · 0 评论 -
HDU1403(两个串的最长公共子串)
题目题意: 给你两个字符串,求他们的最长公共子串。题解:将两个字符串连接成一个字符串,后缀数组 get_h(),h[i]代表后缀排名为i与排名为i-1的最长公共前缀。从坐标x开始的后缀与从坐标y开始的后缀的最长公共前缀最长应该是y的后缀排名和x后缀紧挨着的时候 最大。就可以用 h[]解决。但是要满足一个条件就是x y应该在不同的串上。emmm废话好多。 注意c[]大小应该是N.//...原创 2019-07-27 11:12:09 · 355 阅读 · 0 评论 -
POJ1743(不可重叠最长重复子串 SA+二分)
题目题意: 给你n个数字代表此时的钢琴按键。问最长的重复的节拍。就转化为n-1个值得不可重叠最长重复子串。题目要求节拍对应的串>=5 意思就是这个最长重复节拍应>=4。思路: 二分答案这个子串最长为mid(下面用k),先然满足二分单调性。将n个后缀按字典序排列后,然后将公共前缀长度>=mid得放到一个小组里。而且这个小组得分配是唯一的。一组任意两串的的最长公共前缀都&...原创 2019-09-06 14:53:43 · 311 阅读 · 0 评论 -
POJ3261(可重叠的k次最长重复子串 SA+二分)
题目题意: 给你N K,求这个串出现次数>=K的子串 可重叠。二分答案长度,对n个后缀按字典序分组,使得每组的最长公共前缀>=mid 。判断是否存在一组里面拥有的串的个数>=K 。下面的代码其实是错的!!真不知道那些人怎么过的。。对最后一组的处理很不好。inline int check(int mid){//按height分组后存在一组字符串的个数>=K ...原创 2019-09-06 18:48:25 · 149 阅读 · 0 评论 -
spoj694(不相同子串的个数)
题目#include<cstdio>#include<cstring>using namespace std;const int N=2e4+5;char s[N];int x[N],y[N],c[N],sa[N],rk[N],h[N],n,m;inline void get_sa(){ for(int i=1;i<=m;++i) c[i]=0...原创 2019-09-06 19:49:57 · 169 阅读 · 0 评论