#include #include #include #include using namespace std; const int maxn=40010; const int maxm=30; int n,k,mx; int ss[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) ans=max(ans,temp); } return ans; } void solve() { int L=1,R=n,res=-1,ans=-1; while(L<=R) { int mid=(L+R)>>1; mx=check(mid); if(mx!=-1) { res=mid; ans=mx; L=mid+1; } else R=mid-1; } if(ans!=-1) cout<>k&&k) { cin>>s; n=s.length(); if(k==1)//坑点,特别注意 { cout<