Maximum repetition substring POJ

#include   
#include   
#include   
using namespace std;  
  
const int maxn=100005;  
  
//以下为倍增算法求后缀数组   
int wa[maxn],wb[maxn],wv[maxn],Ws[maxn];  
int cmp(int *r,int a,int b,int l)  
{return r[a]==r[b]&&r[a+l]==r[b+l];}  
  
void da(const int *r,int *sa,int n,int m){  
    int i,j,p,*x=wa,*y=wb,*t;   
    for(i=0;i=0;i--) sa[--Ws[x[i]]]=i;   
    for(j=1,p=1;p=j) y[p++]=sa[i]-j;   
        for(i=0;i上次排序的排名   
        for(i=0;i=0;i--) sa[--Ws[wv[i]]]=y[i];   
        //y[i]->二级排序后第i大的下标,循环从n-1到0由于一级排序相同要看二级排序   
        for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i>1]+1;  
    for(i=1;i<=m;i++)  
        dp[0][i]=height[i];  
    for(j=1;j<=LOG[m];j++){  
        int limit=m+1-(1<>1);  
            dp[j][i]=Min(dp[j-1][x],dp[j-1][i]);  
        }  
    }  
}  
  
int lcp(int l,int r){  
    l=Rank[l];r=Rank[r];  
    if(l>r){  
        int tmp=l;l=r;r=tmp;  
    }  
    l++;//height[i]表示排名i与i-1的lcp   
    int m=LOG[r-l+1];  
    return Min(dp[m][l],dp[m][r-(1<=0 && t+ir?k:r;
				}
				if(r==max){
					len[top++]=i;//记录重复数为max的不同长度
				}
				if(r>max){
					top=0;
					len[top++]=i;
					max=r;
				}
			}
		}
		int st=sa[1],ed=sa[1]+1;
		for(i=1;i<=n;i++){ //枚举字典序大小
			for(j=0;j=(max-1)*len[j]){
					//一旦重复数==max 即使长度重复(max-1)*len[j] break 
					st=sa[i];
					ed=sa[i]+max*len[j];
					i=n;
					break;
				}
			}
		}
		printf("Case %d: ",cas++);
		for(i=st;i

你可能感兴趣的:(Suffix,array,ini,算法,c)