Pagini recente » Cod sursa (job #2215326) | Cod sursa (job #1693681) | Cod sursa (job #2289909) | Cod sursa (job #714121) | Cod sursa (job #2549322)
#include<bits/stdc++.h>
#define MOD 666013
#define maxN 17005
#define MOD2 2011
using namespace std;
const int prim=73;
const int prim2=19;
vector<pair<int,int> > h;
char s[maxN];
int pw[maxN],n,st,dr,k,sol,pw2[maxN];
inline int Check(int mid)
{
if(!mid) return 1;
h.clear();
int val=0;
int val2=0;
for(int i=1;i<=mid;i++)
{
val=(val*prim+s[i])%MOD;
val2=(val2*prim2+s[i])%MOD2;
}
h.push_back({val,val2});
for(int i=mid+1;i<=n;i++)
{
val=val-(s[i-mid]*pw[mid-1])%MOD;
while(val<0) val+=MOD;
val=(val*prim+s[i])%MOD;
val2=val2-(s[i-mid]*pw2[mid-1])%MOD2;
while(val2<0) val2+=MOD2;
val2=(val2*prim2+s[i])%MOD2;
h.push_back({val,val2});
}
sort(h.begin(),h.end());
int sz=h.size();
int nr=1,sol=1;
for(int i=0;i<sz;i++)
{
if(h[i].first==h[i+1].first && h[i+1].second==h[i].second)
{
nr++;
sol=max(sol,nr);
}
else nr=1;
}
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]=1;
pw2[0]=1;
for(int i=1;i<=n;i++)
{
pw[i]=(pw[i-1]*prim)%MOD;
pw2[i]=(pw2[i-1]*prim2)%MOD2;
}
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;
}