Cod sursa(job #2922016)

Utilizator EZ4ENCEAleksi Jalli EZ4ENCE Data 2 septembrie 2022 20:47:13
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define NMAX 16384
#define BASE 26
#define MOD1 666013
#define MOD2 666019

using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");

int n, k;
string s;
pair <int, int> vsort[NMAX + 1];

int test(int len) {
  int i, hash1, hash2, power1, power2, maxap, nsort, cnt;

  hash1 = hash2 = 0;
  power1 = power2 = 1;
  for (i = 0; i < len - 1; i++) {
    hash1 = (hash1 * BASE + s[i] - 'a') % MOD1;
    hash2 = (hash2 * BASE + s[i] - 'a') % MOD2;

    power1 = (power1 * BASE) % MOD1;
    power2 = (power2 * BASE) % MOD2;
  }

  nsort = 0;
  for (i = len - 1; i < n; i++) {
    hash1 = (hash1 * BASE + s[i] - 'a') % MOD1;
    hash2 = (hash2 * BASE + s[i] - 'a') % MOD2;

    vsort[nsort++] = {hash1, hash2};

    hash1 = (hash1 - (power1 * (s[i - len + 1] - 'a')) % MOD1 + MOD1) % MOD1;
    hash2 = (hash2 - (power2 * (s[i - len + 1] - 'a')) % MOD2 + MOD2) % MOD2;
  }

  sort(vsort, vsort + nsort);

  cnt = 1;
  maxap = 1;
  for (i = 1; i < nsort; i++) {
    if (vsort[i] == vsort[i - 1])
      cnt++;
    else
      cnt = 1;
    maxap = max(maxap, cnt);
  }

  return maxap;
}

int bs(int st, int dr) {
  int mij, sol, val;

  while (st <= dr) {
    mij = (st + dr) / 2;
    val = test(mij);

    if (val >= k) {
      st = mij + 1;
      sol = mij;
    }
    else
      dr = mij - 1;
  }

  return sol;
}

int main() {
  fin >> n >> k >> s;
  fout << bs(1, n);
  return 0;
}