Cod sursa(job #2844106)

Utilizator vlad2009Vlad Tutunaru vlad2009 Data 3 februarie 2022 19:31:07
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.49 kb
#include <fstream>
#include <cstring>
#include <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::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 (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;
}

bool isDigit[256] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

class InParser {
private:
  FILE *fin;
  char *buff;
  int sp;

  char read_char() {
    ++sp;
    if (sp == 4096) {
      sp = 0;
      fread(buff, 1, 4096, fin);
    }
    return buff[sp];
  }

public:
  InParser(const char* nume) {
    fin = fopen(nume, "r");
    buff = new char[4096]();
    sp = 4095;
  }
  InParser& operator >> (char S[]) {
    char c;
    int n = 0;
    while (isDigit[c = read_char()]) {
      S[n++] = c;
    }
    return* this;
  }
};

int main() {
  std::ifstream fin("substr.in");
  std::ofstream fout("substr.out");
  int n;
  char* S = new char[1 + MAX_N];
  fin >> 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);
  fout << answer;
  return 0;
}