/*
suffix数组:第i位到最后的字符串
sa数组:将排序后的后缀的开头位置顺次放入SA中,称为后缀数组
rank数组:令rank[i]保存suffix[i]在排序中的名次,名次数组
*/
#include "stdio.h"
#include "string.h"
#define maxn 20004
#define maxm 1000005
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)=0;i--) b[--ws[wv[i]]]=a[i];
return;
}
void dc3(int *r,int *sa,int n,int m)
{
int i,j,*rn=r+n,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
r[n]=r[n+1]=0;
for(i=0;ib) {t=a;a=b;b=t;}
return(height[askRMQ(a+1,b)]);
}
/*
*/
char st[maxn];
int r[maxn*3],sa[maxn*3];
/*求最长回文长
int main()
{
int i,n,len,k,ans=0,w;
scanf("%s",st);
len=strlen(st);
for(i=0;ians) ans=k*2,w=i-k;
k=lcp(i,n-i-1);
if(k*2-1>ans) ans=k*2-1,w=i-k+1;
}
st[w+ans]=0;
printf("%s\n",st+w);
return 0;
}*/
/*求最大公共字串长
int main()
{
int i,j,n,ans=0;
scanf("%s",st);
j=strlen(st);
st[j]=1;
scanf("%s",st+j+1);
n=strlen(st);
for(i=0;ians)
if((jsa[i])
|| (j>sa[i-1] && jmax) max=sa[i];
if(max-min>k) return(1);
}
}
return(0);
}
int main()
{
int i,j=0,k,n;
int min,mid,max;
scanf("%d",&n);
while(n!=0)
{
n--;
for(i=0;i=4) printf("%d\n",max+1);
else printf("0\n");
scanf("%d",&n);
}
return 0;
}
*/
/*
可重叠的 k 次最长重复子串
给定一个长度为n的整数序列,求其中至少出现k次的子序列长度最长为多长
int check(int n,int k,int mid)
{
int i,s=1;
for(i=1;i<=n;i++)
if(height[i]>=mid)
{
s++;
if(s>=k) return(1);
}
else s=1;
return(0);
}
int main()
{
int i,k,n;
int min,mid,max;
scanf("%d %d",&n,&k);
for(i=0;i0)
{
scanf("%s",st);
n=strlen(st);
for(i=0;i=a[c])
{
ss-=(long long)(a[c-1]-a[c])*b[c-1];
a[c-1]=a[c];
b[c-1]+=b[c];
c--;
}
}
printf("%I64d\n",ans);
scanf("%d",&k);
}
return 0;
}
*/