二分答案,利用height数组进行判定。
1 #include2 #include 3 #include 4 using namespace std; 5 const int maxn=20000+10; 6 const int maxvalue=1000000+10; 7 int s[maxn]; 8 int sa[maxn],t[maxn],t2[maxn],c[maxvalue],n; 9 int rank[maxn],height[maxn];10 void build_sa(int m)11 {12 int i,*x=t,*y=t2;13 for(i=0;i =0;i--) sa[--c[x[i]]]=i;17 18 for(int k=1;k<=n;k<<=1)19 {20 int p=0;21 for(i=n-k;i =k) y[p++]=sa[i]-k;23 24 for(i=0;i =0;i--) sa[--c[x[y[i]]]]=y[i];28 29 swap(x,y);30 p=1;x[sa[0]]=0;31 for(i=1;i =n) break;34 m=p;35 }36 }37 void getHeight()38 {39 int i,k=0;40 for(i=0;i =num-1) return true;60 }61 }62 return false;63 }64 int main()65 {66 int k;67 while(scanf("%d%d",&n,&k)!=EOF)68 {69 int maxv=0;70 for(int i=0;i maxv) maxv=s[i];74 }75 build_sa(maxv+1);76 getHeight();77 int l=1,r=n/2;78 int ans=-1;79 while(l<=r)80 {81 int mid=(l+r)>>1;82 if(check(mid,k))83 {84 ans=mid;85 l=mid+1;86 }87 else88 r=mid-1;89 }90 printf("%d\n",ans);91 }92 return 0;93 }