后缀数组求 LCP 和相关证明一些定义SA(i) 排名为 i 的后缀左端点;rank(i) 左端点为 i 的后缀排名;suf(i) 左端点为 i 的后缀;lcp(S,T),串 S 和T 的最长公共前缀,即 max{x|∀y≤x,Sy=Sy};LCP(i,j),排名为 i 的后缀和排名为 j 的后缀的最长公共前缀,即 lcp(suf(SA(i)),suf(SA(j))...
[TJOI2017]DNA——后缀数组求LCP 题目大意: 给定一个文本串和一个模式串,求文本串中有多少个连续的子串和模式串相差不超过三个字符。 思路: 算是一道后缀数组的模板题。 直接做lcp,然后遇到匹配不上的就跳,跳的次数不能超过三次。 具体地,将两个字符串连在一起,中间加一个分隔符,然后求出height,用rmq维护h...
显然这样扫过来 子串字典序是递减的 因此可以得到第k大子串W 然后再贪心 n downto 1 若遇到比 W大的子串 就划分,验证 当前二分的这个第k大可不可行 判断 比W大还是小 用hash 二分求LCP即可 Assassin
利用RMQ求子串lcp的基础题,这个板子是我之前的,比较蠢的一种实现 后面试试用最新的板子AC一下 + View Code
[k]); } int lcp(int l,int r) //后缀l和后缀r { if(l==r) return cnt-sa[l]; if(l>r) swap(l,r); if(l+1==r) return height[r]; else return query(l+1,r); } int getl(int x,int k) { int l=1,r=x; int ans=0; while(l<=r) { int m=(l+r)/2; if(lcp(m...