Pagini recente » Cod sursa (job #1331197) | Cod sursa (job #490092) | Cod sursa (job #2473598) | Cod sursa (job #2053336) | Cod sursa (job #1587836)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define nmax 17000
#define teta 'z'-'0'+1
using namespace std;
int n,k,p,pmax,sol;
char s[nmax];
const int mod[3]={666011,666013,100007};
struct hashing{int h[3];} v[nmax],r;
int sorthashing(const hashing &a,const hashing &b)
{
for (int i=0;i<3;i++)
if (a.h[i]!=b.h[i])
return a.h[i]<b.h[i];
return 0;
}
int same(const hashing &a,const hashing &b)
{
for (int i=0;i<3;i++)
if (a.h[i]!=b.h[i])
return 0;
return 1;
}
int main()
{
int i,j;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d %d\n%s\n",&n,&k,&s);
int mijl,sol=0,st=0,dr=n;
while (st<=dr) {
mijl=(st+dr)>>1;
memset(v,0,sizeof(v));
for (j=0;j<3;j++)
r.h[j]=1;
for (i=1;i<mijl;i++)
for (j=0;j<3;j++) {
r.h[j]*=teta;
r.h[j]=(r.h[j]+mod[j])%mod[j];
}
for (i=0;i<mijl;i++)
for (j=0;j<3;j++) {
v[mijl-1].h[j]*=teta;
v[mijl-1].h[j]+=s[i]-'0';
v[mijl-1].h[j]%=mod[j];
}
for (i=mijl;i<n;i++) {
v[i]=v[i-1];
for (j=0;j<3;j++) {
v[i].h[j]-=1LL*(s[i-mijl]-'0')*r.h[j]%mod[j];
v[i].h[j]+=mod[j];
v[i].h[j]*=teta;
v[i].h[j]+=s[i]-'0';
v[i].h[j]%=mod[j];
}
}
sort(v+mijl-1,v+n,sorthashing);
p=pmax=1;
for (i=mijl;i<n;i++) {
if (same(v[i-1],v[i])) {
p++;
if (p>pmax)
pmax=p;
}
else
p=1;
}
if (pmax>=k) {
sol=mijl;
st=mijl+1;
}
else
dr=mijl-1;
}
printf("%d",sol);
return 0;
}