Cod sursa(job #1522394)

Utilizator lauratalaatlaura talaat lauratalaat Data 11 noiembrie 2015 17:39:46
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
struct  bine { int nr1; };
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 l,lmax,i;
   l=1;
   lmax=0;
   for(i=1;i<n;i++)
    if(v[i].nr1==v[i+1].nr1)
        l++;
    else{
        if(l>lmax)
            lmax=l;
        l=1;
    }
    if(l>lmax)
        lmax=l;
    return lmax;
}
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)+n1)%n1)*b)%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);
        if(r<q)
            dr=m-1;
        else{
            st=m+1;
            l=m;
        }
    }
    printf("%d\n",l);
    return 0;
}