Pagini recente » Cod sursa (job #2446715) | Cod sursa (job #508427) | Cod sursa (job #2273622) | Cod sursa (job #418935) | Cod sursa (job #522746)
Cod sursa(job #522746)
#include <stdio.h>
#define NMAX 16505
#define MOD1 100007
#define MOD2 100021
#define P 73
#define ll long long
int n,k,B[NMAX],C[NMAX],P1[NMAX],P2[NMAX];
int D[MOD1],E[MOD2],F[NMAX],G[NMAX],r;
char A[NMAX];
void precompute()
{
int i;
P1[0]=1; P2[0]=1;
for (i=1; i<=n; i++)
{
B[i]=(B[i-1]*P+A[i])%MOD1;
C[i]=(C[i-1]*P+A[i])%MOD2;
P1[i]=(P1[i-1]*P)%MOD1;
P2[i]=(P2[i-1]*P)%MOD2;
}
}
inline int code1(int st,int dr)
{
int act1,act2;
act1=((ll)B[st-1]*P1[dr-st+1])%MOD1;
act2=B[dr]-act1;
if (act2<0)
act2+=MOD1;
return act2;
}
inline int code2(int st,int dr)
{
int act1,act2;
act1=((ll)C[st-1]*P2[dr-st+1])%MOD2;
act2=C[dr]-act1;
if (act2<0)
act2+=MOD2;
return act2;
}
int ok(int val)
{
int i,found=0;
r=0;
for (i=1; i<=n-val+1; i++)
{
F[++r]=code1(i,i+val-1);
G[r]=code2(i,i+val-1);
D[F[r]]++;
E[G[r]]++;
}
for (i=1; i<=r; i++)
if (D[F[i]]>=k && E[F[i]]>=k)
{
found=1;
break ;
}
for (i=1; i<=r; i++)
{
D[F[i]]--;
E[G[i]]--;
}
return found;
}
int cbin()
{
int i,step=1;
for (step=1; step<=n; step<<=1);
for (i=0; step; step>>=1)
if (i+step<=n && ok(i+step))
i+=step;
return i;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d\n",&n,&k);
fgets(A+1,NMAX,stdin);
precompute();
printf("%d\n",cbin());
return 0;
}