Pagini recente » Cod sursa (job #2619047) | Cod sursa (job #1763240) | Cod sursa (job #2226377) | Cod sursa (job #185386) | Cod sursa (job #1147037)
#include <cstdio>
#include <vector>
#define Nmax 17000
#define P (1<<15)
#define X 6453432
using namespace std;
int N,K;
char a[Nmax];
struct coord
{
int val,pas;
};
vector <coord> H[P+10];
inline void AdaugaHash(coord x)
{
int i=(x.val&(P-1));
H[i].push_back(x);
}
inline int CautaHash(int x, int L)
{
int i=(x&(P-1)),cnt=0,len,j;
len=H[i].size();
for(j=0;j<len;++j)
if(H[i][j].val==x && H[i][j].pas==L)
++cnt;
return cnt;
}
inline bool Ok(int L)
{
int v=0,aux=1,i;
coord w;
for(i=1;i<L;++i)
aux=((1LL*aux*X)&(P-1));
for(i=1;i<=L;++i)
v=((1LL*v*X+a[i]-'0')&(P-1));
w.val=v; w.pas=L;
AdaugaHash(w);
for(i=L+1;i<=N;++i)
{
v=(((1LL*((v-(1LL*(a[i-L]-'0')*aux)&(P-1))+P)&(P-1))*X+a[i]-'0')&(P-1));
w.val=v; w.pas=L;
AdaugaHash(w);
}
v=0;
for(i=1;i<=L;++i)
v=((1LL*v*X+a[i]-'0')&(P-1));
if(CautaHash(v,L)>=K)
return true;
for(i=L+1;i<=N;++i)
{
v=(((1LL*((v-(1LL*(a[i-L]-'0')*aux)&(P-1))+P)&(P-1))*X+a[i]-'0')&(P-1));
if(CautaHash(v,L)>=K)
return true;
}
return false;
}
int main()
{
int st,dr,mij,sol;
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf("%d%d%s", &N,&K,(a+1));
st=1; dr=N;
while(st<=dr)
{
mij=(st+dr)/2;
if(Ok(mij))
{
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
printf("%d\n", sol);
return 0;
}