这是一道后缀匹配的模板题
我们只需要将height算出来
然后二分一下答案就可以了
#include#include #include #include using namespace std;const int maxn=1010000;int data[maxn];int rank[maxn];int tot[maxn];int sa[maxn];int pas[maxn];int len,n,m;int height[maxn];int k;void build_Sa(){ m=150; for(int i=0;i =0;i--) sa[--tot[rank[i]]]=i; for(int k=1;k<=n;k<<=1) { int num=0; for(int i=n-k;i =k) pas[num++]=sa[i]-k; for(int i=0;i<=m;i++) tot[i]=0; for(int i=0;i =0;i--) sa[--tot[rank[pas[i]]]]=pas[i],pas[i]=0; swap(pas,rank); num=1;rank[sa[0]]=1; for(int i=1;i =n) break; m=num; }}void build_LCP(){ int h=0; /*for(int i=0;i =val) now+=1; else now=0; if(now>=k-1) return true; } return false;}int main(){ scanf("%d%d",&n,&k); for(int i=0;i >1; if(check(mid)) l=mid; else r=mid-1; } printf("%d", check(r) ? r : l );}/*8 21232323112323231*/