Pagini recente » Cod sursa (job #1010284) | Cod sursa (job #1010383) | Monitorul de evaluare | Cod sursa (job #1732789) | Cod sursa (job #1521340)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define n1 100007
#define n2 666013
using namespace std;
char s[20001],c;
int cate,i;
struct eu{int x,y;};
eu v[20001];
bool sorting(eu a,eu b)
{
if(a.x<b.x||a.x==b.x&&a.y<b.y)
return 1;
return 0;
}
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;
x=1;
y=1;
for(i=1;i<=mid;i++)
{
if(i!=1)
{
x=(x*123)%n1;
y=(y*123)%n2;
}
}
nrr1=0,nrr2=0;
for(i=0;i<mid;i++)
{
q=s[i];
nrr1=nrr1*123+q;
nrr2=nrr2*123+q;
nrr1%=n1;
nrr2%=n2;
}
cate=0;
v[++cate].x=nrr1;
v[cate].y=nrr2;
for(i=0;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;
v[++cate].x=nrr1;
v[cate].y=nrr2;
}
sort(v+1,v+cate+1,sorting);
int l=1,lmax=0;
for(i=2;i<=cate;i++)
{
if(v[i].x==v[i-1].x&&v[i].y==v[i-1].y)
l++;
else
{
if(l>lmax)
lmax=l;
l=1;
}
}
if(l>lmax)
lmax=l;
if(lmax>=k)
{
o=mid;
l1=mid+1;
}
else
l2=mid-1;
}
printf("%d",o);
return 0;
}