k_over 重叠字符串

来源:互联网 发布:手机超星怎么看网络课 编辑:程序博客网 时间:2024/06/05 09:05
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 1024
#define maxm 1024


int bufa[maxn],bufb[maxn],bufs[maxm],bufv[maxn];
int sa[maxn],height[maxn],rank[maxn];


int cmp(int *src,int a,int b,int l){
return src[a]==src[b]&&src[a+l]==src[b+l];
}
void da(int *src,int n,int m)
{
int i,*x=bufa,*y=bufb,*t;
for(i=0;i<m;i++)   bufs[i]=0;
for(i=0;i<n;i++)   bufs[x[i]=src[i]]++;
for(i=1;i<m;i++)   bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--)sa[--bufs[x[i]]]=i;


int p=0,j;
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++) bufv[i]=x[y[i]];

for(i=0;i<m;i++) bufs[i]=0;
for(i=0;i<n;i++) bufs[bufv[i]]++;
for(i=1;i<m;i++) bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--) sa[--bufs[bufv[i]]]=y[i];


for(t=x,x=y,y=t,i=1,p=1,x[sa[0]]=0;i<n;i++)
 x[sa[i]]=cmp(y,sa[i],sa[i-1],j)? p-1:p++;
}
}


void cal_height(int *src,int n)
{
int i,k,j;
for(i=1;i<n;++i) rank[sa[i]]=i;
for(i=0,k=0;i<n;height[rank[i++]]=k)
 for(k? k--:0,j=sa[rank[i]-1];src[i+k]==src[j+k];k++)
;
}


int RMQ[maxn],mm[maxn];
int best[20][maxn];


void initRMQ(int n)
{
int i,j,a,b;
for(mm[0]=-1,i=1;i<n;i++)
 mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
for(i=1;i<n;i++) best[0][i]=i;
for(i=1;i<=mm[n-1];i++)
 for(j=1;j<n-(1<<i)+1;j++){
a=best[i-1][j];
b=best[i-1][j+(1<<(i-1))];
best[i][j]=RMQ[a]>RMQ[b]? a:b;
 }
}


int askRMQ(int a,int b)
{
int t;
t=mm[b-a+1]; b-=((1<<t)-1);
a=best[t][a];
b=best[t][b];
return RMQ[a]>RMQ[b] ? sa[a-1]:sa[b-1];
}


int abs(int n) { return n<0? -n:n;}


int check(int n)
{
int test=(n-1)/2,i;
int max=0,min=0x7fffffff;
for(;test>0;test--){
printf("test=%d\n", test);
for(i=1;i<n;i++)
 if(height[i]>=test){
if(sa[i-1]>max) max=sa[i-1];
if(sa[i]>max) max=sa[i];
if(sa[i-1]<min) min=sa[i-1];
if(sa[i]<min) min=sa[i];
if(max-min>=test)
 return test;
 }
 else 
max=0;
}
return test;
}


int main()
{
char src[maxn],c;
int nsrc[maxn];
int i=0,n;
bzero(src,sizeof(src));
while((c=getchar())!='\n') src[i++]=c;
n=strlen(src);
for(i=0;i<n;i++) nsrc[i]=src[i];
nsrc[n++]=0;


da(nsrc,n,1024);
cal_height(nsrc,n);


for(i=1;i<n;i++) RMQ[i]=height[i];


initRMQ(n);


for(i=1;i<n;i++) printf("%d--> %d\n",i,height[i]);puts("");
for(i=1;i<n;i++) printf("%d\n", sa[i]-sa[i-1]);
for(i=0;i<n;i++) printf("%s\n",src+sa[i]);


printf("%d\n",check(n));





// printf("max len lapped substr:\n");
// int pos=askRMQ(1,n-1);
// int slen=RMQ[rank[pos]+1];
// printf("slen=%d\n",slen);
// printf("pos=%d\n",pos);
// *(src+pos+slen)=0;
// printf("%s\n",src+pos);

}
原创粉丝点击