Cod sursa(job #1522621)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 11 noiembrie 2015 21:07:19
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <cstdio>
#define MOD1 666013
#define MOD2 100007
#define BAZA 991
#define MAXN 16384
char v[MAXN];
int x[MAXN],y[MAXN];
inline void swap(int b,int e){
    int aux=x[b];
    x[b]=x[e];
    x[e]=aux;
    aux=y[b];
    y[b]=y[e];
    y[e]=aux;
}
void myqsort(int begin,int end,int *z){
    int b=begin,e=end,aux,pivot=z[(b+e)/2];
    while(b<=e){
        while(z[b]<pivot) b++;
        while(z[e]>pivot) e--;
        if(b<=e){
            swap(b,e);
            b++;e--;
        }
    }
    if(begin<e) myqsort(begin,e,z);
    if(b<end) myqsort(b,end,z);
}
inline int cauta(int l,int k,int n){
   int i,p1,p2,nr1,nr2,max=0,j;
    p1=p2=1;
    nr1=nr2=0;
    for(i=l-1;i>=0;i--){
        nr1=(nr1+p1*v[i])%MOD1;
        nr2=(nr2+p2*v[i])%MOD2;
        if(i>0){
           p1=(p1*BAZA)%MOD1;
           p2=(p2*BAZA)%MOD2;
        }
    }
    x[0]=nr1;
    y[0]=nr2;
    for(i=l;i<n;i++){
        nr1=(((nr1-(v[i-l]*p1)%MOD1+MOD1)%MOD1)*BAZA+v[i])%MOD1;
        nr2=(((nr2-(v[i-l]*p2)%MOD2+MOD2)%MOD2)*BAZA+v[i])%MOD2;
        x[i-l+1]=nr1;
        y[i-l+1]=nr2;
    }
    myqsort(0,n-l,x);
    i=0;
    while(i<n-l+1){
        j=i;
        while(j<n-l&&x[j]==x[j+1])
             j++;
        myqsort(i,j,y);
        i=j+1;
    }
    i=0;
    while(i<n-l+1){
        j=i;
        while(j<n-l&&x[j]==x[j+1]&&y[j]==y[j+1])
            j++;
        if(j-i+1>max)
            max=j-i+1;
        i=j+1;
    }
    if(max>=k)
        return 1;
    return 0;
}
int main(){
    FILE*fi,*fout;
    int rez,pas,i,n,k;
    char a;
    fi=fopen("substr.in" ,"r");
    fout=fopen("substr.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&k);
    a=fgetc(fi);
    for(i=0;i<n;i++)
       v[i]=fgetc(fi);
    rez=0;
    for(pas=1<<15;pas;pas>>=1)
      if(rez+pas<=n&&cauta(rez+pas,k,n)==1)
          rez+=pas;
    fprintf(fout,"%d" ,rez);
    fclose(fi);
    fclose(fout);
    return 0;
}