Pagini recente » Cod sursa (job #1636387) | Cod sursa (job #2322569) | Cod sursa (job #3195006) | Cod sursa (job #1676567) | Cod sursa (job #1768475)
#include <stdio.h>
#define MOD1 666019
#define MOD2 9478671
#define B 123
#define MAX_N 16384
FILE *fin,*fout;
char v[MAX_N+1];
int hash[MOD1],val[MAX_N+1],val2[MAX_N+1],next[MAX_N+1],frecv[MAX_N+1],m,max,n,k;
void Read()
{
int i;
fscanf(fin,"%d%d",&n,&k);
fgetc(fin);
for(i=0;i<n;i++)
v[i]=fgetc(fin);
}
inline void add(int x,int y)
{
int p=hash[x];
while(p)
{
if(val[p]==y)
{
frecv[p]++;
if(frecv[p]>max)
max=frecv[p];
return;
}
p=next[p];
}
val[++m]=y;
val2[m]=x;
frecv[m]=1;
next[m]=hash[x];
hash[x]=m;
}
inline int verif(int l)
{
int a,b,ha,hb,i;
m=a=b=0;ha=hb=max=1;
for(i=0;i<l-1;i++)
{
a=(a*B+v[i])%MOD1;
b=(b*B+v[i])%MOD2;
ha=(ha*B)%MOD1;
hb=(hb*B)%MOD2;
}
for(i=l-1;i<n;i++)
{
a=(a*B+v[i])%MOD1;
b=(b*B+v[i])%MOD2;
add(a,b);
a=(a-(ha*v[i-l+1])%MOD1+MOD1)%MOD1;
b=(b-(hb*v[i-l+1])%MOD2+MOD2)%MOD2;
}
for(i=1;i<=m;i++)
hash[val2[i]]=0;
return max;
}
int cbin()
{
int pas,rez;
rez=0;
for(pas=1<<14;pas;pas>>=1)
if(rez+pas<=n && verif(rez+pas)>=k)
rez+=pas;
return rez;
}
int main()
{
fin=fopen("substr.in","r");
fout=fopen("substr.out","w");
Read();
fprintf(fout,"%d",cbin());
fclose(fin);
fclose(fout);
return 0;
}