后缀数组

后缀数组

# include <bits/stdc++.h> 
using namespace std;  

typedef long long LL;
const int MAXN=1e5+100;
int wa[MAXN],wb[MAXN],wv[MAXN],wt[MAXN];    
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,j,p,*x=wa,*y=wb,*t;  
for(i=0;i<m;i++) wt[i]=0;  
for(i=0;i<n;i++) wt[x[i]=r[i]]++;  
for(i=1;i<m;i++) wt[i]+=wt[i-1];  
for(i=n-1;i>=0;i--) sa[--wt[x[i]]]=i;  
for(j=1,p=1;p<n;j*=2,m=p){  
for(p=0,i=n-j;i<n;i++) y[p++]=i;  
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;  
for(i=0;i<n;i++) wv[i]=x[y[i]];  
for(i=0;i<m;i++) wt[i]=0;  
for(i=0;i<n;i++) wt[wv[i]]++;  
for(i=1;i<m;i++) wt[i]+=wt[i-1];  
for(i=n-1;i>=0;i--) sa[--wt[wv[i]]]=y[i];  
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)  
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;  
}  
}  
int Rank[MAXN],height[MAXN];  
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<n;i++) {  
if(k)k--;  
int j=sa[Rank[i]-1];  
while(r[i+k]==r[j+k]) k++;  
height[Rank[i]]=k;  
}    
return ;  
}  
int r[MAXN],sa[MAXN];  
char str[MAXN] ;
int m;
int check(int k,int len) {
int last=sa[1];
int cnt=1;
int ans=-1;
for(int i=2;i<=len;i++) {
if(height[i]<k) {
if(cnt>=m) {
ans=max(ans,last) ;
}
cnt=0;
last=sa[i];
}
cnt++;
last=max(last,sa[i]);
}
if(cnt>=m){
ans=max(ans,last) ;
}
return ans;
}
int main(){

while(1) {
scanf("%d",&m);
if(m==0) break;
cin>>str;
int len=strlen(str) ;
if(m==1){
printf("%d %d\n",len,0) ;
continue ;
}
for(int i=0;i<len;i++)
r[i]=str[i];
r[len]=0;
da(r,sa,len+1,200) ;
calheight(r,sa,len) ;
int l=0,r=len,mid;
int ans;
while(l<r) {
mid=(l+r+1)>>1 ;
ans=check(mid,len) ;
if(ans!=-1){
l=mid;
}else{
r=mid-1;
}
}
if(l==0) {
printf("none\n");
}else{
ans=check(l,len);
printf("%d %d\n",l,ans);
}
}
return 0;
}
/*
3
baaaababababbababbab
11
baaaababababbababbab
3
cccccc
0
*/



posted @ 2022-02-27 13:51  fengzlj  阅读(39)  评论(0)    收藏  举报