Pagini recente » Cod sursa (job #743198) | Cod sursa (job #745105) | Cod sursa (job #1760521) | Cod sursa (job #5209) | Cod sursa (job #522745)
Cod sursa(job #522745)
#include <stdio.h>
#define NMAX 16505
#define MOD1 40153
#define MOD2 40787
#define P 73
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=B[st-1]*P1[dr-st+1];
if (act1>=MOD1)
act1%=MOD1;
act2=B[dr]-act1;
if (act2<0)
act2+=MOD1;
return act2;
}
inline int code2(int st,int dr)
{
int act1,act2;
act1=C[st-1]*P2[dr-st+1];
if (act1>=MOD2)
act1%=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;
}