Pagini recente » Cod sursa (job #1301975) | Cod sursa (job #2711468) | Cod sursa (job #1022955) | Cod sursa (job #390084) | Cod sursa (job #156537)
Cod sursa(job #156537)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
long n,k,m,l,r,v[9901],x[100213],rez,b=73,mod=9901,mod1=100213, b1=19,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;
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;
}
else
r=m-1;
}
printf("%d\n",rez);
return 0;
}