Cod sursa(job #1520911)

Utilizator lauratalaatlaura talaat lauratalaat Data 9 noiembrie 2015 18:12:47
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#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;
}