Cod sursa(job #1520252)

Utilizator herbertoHerbert Mohanu herberto Data 8 noiembrie 2015 15:44:49
Problema Substr Scor 90
Compilator c Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 16835
#define MOD 1000007

char v[MOD+1];
int f[MOD+1];

int main(){
  FILE*fin=fopen("substr.in", "r");
  FILE*fout=fopen("substr.out", "w");
  int n, i, k, baza, st, dr, m, nr1, max, ok;
  fscanf(fin, "%d%d", &n, &k);
  fgetc(fin);
  for(i=1; i<=n; i++)
    v[i]=fgetc(fin);

//  for(i=1; i<=n; i++)
//    printf("%c", v[i]);
  st=1;
  dr=n;
  max=0;
  while(st<=dr){
    m=(st+dr)/2;
//    printf("\n\nm=%d\n", m);
    baza=1;
    for(i=1; i<m; i++)
      baza=(baza*123)%MOD;
    nr1=0;
    for(i=1; i<=m; i++)
      nr1=(nr1*123+v[i])%MOD;


//    printf("baza=%d\n", );
    for(i=0; i<=MOD; i++)
      f[i]=0;

    f[nr1]++;
    for(i=2; i<=n-m+1; i++){
      nr1=((nr1-(v[i-1]*baza)%MOD+MOD)*123+v[i+m-1])%MOD;
//      printf("%d\n", nr1);
      f[nr1]++;
    }

    ok=0;
    for(i=0; i<=MOD; i++)
      if(f[i]>=k){
        ok=1;
        if(m>max)
          max=m;
      }

    if(ok==1)
      st=m+1;
    else
      dr=m-1;

//    st=dr+1;

  }
  fprintf(fout, "%d", max);
  return 0;
}