Cod sursa(job #2844114)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 3 februarie 2022 19:44:37
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <cstring>
#include <unordered_map>

const int MAX_N = 16384;
const int B = 257;
const int P = 1e9 + 7;
int prefH[1 + MAX_N], powerB[1 + MAX_N];
std::unordered_map<int, int> mp;
int k;

int rangeHash(int l, int r) {
  return (prefH[r] - (long long)prefH[l - 1] * powerB[r - l + 1] % P + P) % P;
}

bool ok(int n, int l) {
  mp.clear();
  for (int i = 1; i + l - 1 <= n; i++) {
    mp[rangeHash(i, i + l - 1)]++;
  }
  for (const auto &it : mp) {
    if (it.second >= k) {
      return true;
    }
  }
  return false;
}

int cb(int n) {
  int st = 1, dr = n, sol = 0;
  while (st <= dr) {
    int mijl = (st + dr) / 2;
    if (ok(n, mijl)) {
      sol = mijl;
      st = mijl + 1;
    } else {
      dr = mijl - 1;
    }
  }
  return sol;
}

int main() {
  freopen("substr.in", "r", stdin);
  freopen("substr.out", "w", stdout);
  int n;
  char* S = new char[1 + MAX_N];
  scanf("%d%d%s", &n, &k, S);
  for (int i = 1; i <= n; i++) {
    prefH[i] = ((long long)prefH[i - 1] * B + S[i - 1] - 'a') % P;
  }
  powerB[0] = 1;
  for (int i = 1; i <= n; i++) {
    powerB[i] = (long long)powerB[i - 1] * B % P;
  }
  int answer = cb(n);
  printf("%d", answer);
  return 0;
}