Pagini recente » Cod sursa (job #2783953) | Cod sursa (job #941867) | Cod sursa (job #342276) | Cod sursa (job #2813262) | Cod sursa (job #156611)
Cod sursa(job #156611)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
long n,k,m,l,r,v[666013],x[20549],rez,b=73,mod=666013,mod1=20549, b1=467,i;
char C[16390],mn;
bool posibil(long m)
{
memset(v,0,sizeof(v));
memset(x,0,sizeof(x));
long i,j,v1,v2,t1,t2,max1,max2;
t1=t2=1;
for (i=1;i<=m-1;i++)
{
t1=t1*b%mod;
t2=t2*b1%mod1;
}
v1=0;v2=0;
for (i=1;i<=m;i++)
{
v1=(v1*b+(C[i]))%mod;
v2=(v2*b1+(C[i]))%mod1;
}
v[v1]++;
x[v2]++;
for (i=m+1;i<=n;++i)
{
v1=v1-(t1*(C[i-m])%mod);
if (v1<0)
v1+=mod;
v2=v2-(t2*(C[i-m])%mod1);
if (v2<0)
v2+=mod1;
v1=(v1*b+(C[i]))%mod;
v2=(v2*b1+(C[i]))%mod1;
v[v1]++;
x[v2]++;
}
max1=max2=0;
for (i=0;i<=mod;i++)
if (v[i]>max1)
max1=v[i];
for (i=0;i<=mod1;i++)
if (x[i]>max2)
max2=x[i];
if (max1>max2)
max1=max2;
if (max1>=k)
return true;
else
return false;
}
int main(){
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&k);
cin>>C+1;
/*for (i=0;i<strlen(C);i++)
{
/* if (C[i]>='0')
mn+=40;
if (C[i]>='A')
mn+=50;
if (C[i]>='a')
mn+=6;
C[i]-=40;
}*/
l=1;
r=n;
while (l<=r)
{
m=(l+r)/2;
if (posibil(m))
{
rez=m;
l=m+1;
// printf("%d\n",m);
}
else
r=m-1;
}
printf("%d\n",rez);
return 0;
}