#include #include #include #include using namespace std; const int maxn=20010; const int maxm=1000010; int n,k,mx; int a[maxn],sa[maxn],rank[maxn],height[maxn];; int wa[maxn],wb[maxn],wv[maxn],c[maxm];//c[]用于基数排序统计 int cmp(int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l]; } void da(int *r,int *sa,int n,int m) { int i,k,p,*x=wa,*y=wb; for(i=0;i=0;i--) sa[--c[x[i]]]=i; for(k=1;k<=n;k<<=1) { //直接利用sa排序第二关键字 p=0; for(i=n-k;i=k) y[p++]=sa[i]-k; //基数排序第一关键字 for(i=0;i=0;i--) sa[--c[wv[i]]]=y[i]; //根据sa和x数组,重新计算新的x数组 swap(x,y);//y数组已经没有用,更新x需要使用x本身数据,因此放入y使用 p=1,x[sa[0]]=0; for(i=1;i=n)//排序结束 break; m=p; } } void calheight(int *r,int *sa,int n) { int i,j,k=0; for(i=1;i<=n;i++) rank[sa[i]]=i; for(i=0;i=k) return 1; } return 0; } void solve() { int L=1,R=n,res=-1; while(L<=R) { int mid=(L+R)>>1; if(check(mid)) { res=mid; L=mid+1; } else R=mid-1; } cout<>n>>k; for(int i=0;i>a[i]; mx=max(mx,a[i]); } a[n]=0; da(a,sa,n+1,mx+1); calheight(a,sa,n); solve(); return 0; }