Pagini recente » Cod sursa (job #937771) | Cod sursa (job #28777) | Cod sursa (job #155395) | Cod sursa (job #925573) | Cod sursa (job #1988083)
#include<bits/stdc++.h>
#define MOD 666013
#define maxN 17005
using namespace std;
const long long prim=73LL;
int f[MOD+5];
char s[maxN];
long long pw[maxN];
int n,st,dr,k,sol;
inline int Check(int mid)
{
if(!mid) return 1;
memset(f,0,sizeof(f));
//M.clear();
long long val=0;
for(int i=1;i<=mid;i++)
{
val=(val*(1LL*prim)+1LL*s[i])%MOD;
}
// M[val]=1;
f[val]=1;
int sol=1;
for(int i=mid+1;i<=n;i++)
{
val=val-((1LL*s[i-mid])*pw[mid-1])%MOD;
while(val<0) val+=MOD;
val=(val*(1LL*prim)+1LL*s[i])%MOD;
// it=M.find(val);
// if(it!=M.end())
// {
// it->second++;
// sol=max(sol,it->second);
//}
// else
// {
// M[val]=1;
//}
f[val]++;
sol=max(sol,f[val]);
}
return sol;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&k);
scanf("%s",s+1);
n=strlen(s+1);
pw[0]=1LL;
for(int i=1;i<=n;i++)
{
pw[i]=(pw[i-1]*prim)%MOD;
}
st=0;
dr=n;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(Check(mid)>=k)
{
sol=mid;
st=mid+1;
}
else dr=mid-1;
}
printf("%d\n",sol);
return 0;
}