Pagini recente » Cod sursa (job #1702881) | Cod sursa (job #1207407) | Cod sursa (job #738634) | Cod sursa (job #1212733) | Cod sursa (job #1521136)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define n1 100007
#define n2 100021
using namespace std;
char s[20001],c;
int cate,i;
int x=1,y=1,j,k,l,n,r1,r2,q,nr1,nr2,nrr1=0,nrr2=0,l1,l2,mid,o;
int main ()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d%c",&n,&k,&c);
l1=1;
l2=n-k+1;
gets(s);
while(l1<=l2)
{
int pp=0;
mid=(l1+l2)/2;
for(int co=0;co<n-mid;co++)
{
x=1;
cate=1;
y=1;
nr1=nr2=0;
for(i=co;i<co+mid;i++)
{
q=s[i];
nr1=((nr1*123)%n1+q)%n1;
nr2=((nr2*123)%n2+q)%n2;
if(i!=co)
{
x=(x*123)%n1;
y=(y*123)%n2;
}
}
nrr1=0,nrr2=0;
for(i=co+1;i<co+mid+1;i++)
{
q=s[i];
nrr1=nrr1*123+q;
nrr2=nrr2*123+q;
nrr1%=n1;
nrr2%=n2;
}
if(nrr1==nr1&&nrr2==nr2)
cate++;
for(i=co+1;i<=n-mid-1;i++)
{
int x1,y1;
x1=(x*s[i])%n1;
y1=(y*s[i])%n2;
nrr1-=x1;
nrr2-=y1;
if(nrr1<0)
nrr1+=n1;
if(nrr2<0)
nrr2+=n2;
q=s[i+mid];
nrr1=(nrr1*123+q)%n1;
nrr2=(nrr2*123+q)%n2;
if(nrr1==nr1&&nrr2==nr2)
cate++;
}
if(cate>=k)
{
o=mid;
pp=1;
l1=mid+1;
break;
}
}
if(pp==0)
l2=mid-1;
}
printf("%d",o);
return 0;
}