Cod sursa(job #3130510)

Utilizator Ana_22Ana Petcu Ana_22 Data 17 mai 2023 21:46:13
Problema Substr Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#define NMAX 16384
#define MOD 666013
#define BASE 256

using namespace std;

int word[NMAX];
int frecv[MOD+1];

bool verif( int l, int k, int n ) {
  int put = 1, i, hashval = 0, maxx;
  for( i = 0; i < l; i++ ) {
    hashval = ( hashval * BASE + word[i] - 'a' ) % MOD;
    if( i > 0 )
      put = ( put * BASE ) % MOD;
  }
  for( ; i <= n; i++ ) {
    frecv[hashval]++;
    hashval -= ( word[i-l] - 'a' ) * put % MOD;
    if( hashval < 0 ) hashval += MOD;
    hashval = ( hashval * BASE + word[i] - 'a' ) % MOD;
  }
  maxx = 0;
  for( i = 0; i < MOD; i++ ) {
    maxx = max( frecv[i], maxx );
    frecv[i] = 0;
  }
  return maxx >= k;
}

int main() {
    FILE *fin, *fout;
    int n, k, i, st, dr, mijl;
    fin = fopen( "substr.in", "r" );
    fout = fopen( "substr.out", "w" );
    fscanf( fin, "%d%d ", &n, &k );
    for( i = 0; i < n; i++ )
      word[i] = fgetc( fin );
    st = 0;
    dr = n + 1;
    while( dr - st > 1 ) {
      mijl = ( st + dr ) / 2;
      if( verif( mijl, k, n ) )
        st = mijl;
      else
        dr = mijl;
    }
    fprintf( fout, "%d\n", st );
    fclose( fin );
    fclose( fout );
    return 0;
}