题意:可重叠的k次最长重复子串
解题关键:利用height数组对后缀进行分组,因为最长公共子串一定会在一个组内,所以判定每个组即可。二分答案,进行判定。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define inf 0x3f3f3f3f 8 using namespace std; 9 const int N=200005;10 int wa[N],wb[N],wv[N],wc[N];11 bool cmp(int *r,int a,int b,int l){ return r[a]==r[b]&&r[a+l]==r[b+l];}12 void make_sa(int *r,int *sa,int n,int m){13 int i,j,p,*x=wa,*y=wb;14 for(i=0;i =0;i--) sa[--wc[x[i]]]=i;18 for(j=1,p=1;p =j) y[p++]=sa[i]-j;21 for(i=0;i =0;i--) sa[--wc[wv[i]]]=y[i];26 for(swap(x,y),p=1,x[sa[0]]=0,i=1;i =x){44 num++;45 if(num>=k) return true;46 }47 else num=1;48 }49 return false;50 }51 52 int erfen(int l,int r){53 while(l >1;55 if(check(mid)) l=mid;56 else r=mid-1;57 }58 return l;59 }60 61 int main(){62 ios::sync_with_stdio(0);63 int maxn=0;64 while(cin>>n>>k){65 for(int i=0;i >r[i],maxn=max(maxn,r[i]);66 r[n]=0;67 make_sa(r, sa, n+1,maxn+1);68 make_height(r, sa, n);69 int ans=erfen(0,n);70 cout< <<"\n";71 }72 return 0;73 }