Pagini recente » Cod sursa (job #2929554) | Cod sursa (job #2102259) | Cod sursa (job #995374) | Cod sursa (job #836274) | Cod sursa (job #1520911)
#include<stdio.h>
#include<algorithm>
using namespace std;
struct bine { int nr1; int nr2 ;};
bine v[16385];
int n1=100007,n2=100021,b=123;
bool sortare ( bine a , bine b ){
return a.nr1<b.nr1;
}
int gasire ( bine v[] , int n , int x){
int l2,l1,m,p1=0,p2=0;
l1=1;
l2=n;
while(l1<=l2){
m=(l1+l2)/2;
if(x<=v[m].nr1){
l2=m-1;
p1=m;
}
else
l1=m+1;
}
l1=1;
l2=n;
while(l1<=l2){
m=(l1+l2)/2;
if(x<v[m].nr1){
l2=m-1;
}
else{
l1=m+1;
p2=m;
}
}
return p2-p1+1;
}
char s[16386];
int main(){
int n,j,st,dr,k,m,nnr1,nnr2,p1,p2,i,r,q,l;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&q);
scanf("%s",&s);
st=1;
dr=n;
while(st<=dr){
k=0;
m=(st+dr)/2;
nnr1=nnr2=0;
p1=p2=1;
for(i=0;i<m;i++){
nnr1=((nnr1*b)%n1+s[i])%n1;
nnr2=((nnr2*b)%n2+s[i])%n2;
if(i!=0){
p1=(p1*b)%n1;
p2=(p2*b)%n2;
}
}
k++;
v[k].nr1=nnr1;
v[k].nr2=nnr2;
for(i=0,j=m;j<n;i++,j++){
nnr1=((((nnr1-(s[i]*p1))%b)%n1+n1)%n1+s[j])%n1;
nnr2=((((nnr2-(s[i]*p2))%b)%n2+n2)%n2+s[j])%n2;
k++;
v[k].nr1=nnr1;
v[k].nr2=nnr2;
}
sort(v+1,v+k+1,sortare);
r=0;
r=gasire(v,k,q);
if(r<q)
dr=m-1;
else{
st++;
if(r>=q)
l=m;
}
}
printf("%d\n",l);
return 0;
}