Cod sursa(job #2327079)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 24 ianuarie 2019 13:07:20
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 16384;

char s[1 + MAXN + 1];
int hash1[MAXN + 1];
int put[MAXN + 1];
const int MOD = 1e9 + 7;
int n, k;
bool check (int l) {
  int sol = 1;
  unordered_map <int, int> f;

  f[hash1[l]]++;
  for(int i = l + 1; i <= n; i++) {
    int h = (hash1[i] - (1LL * hash1[i - l] * put[l]) % MOD + MOD) % MOD;
    f[h]++;
  }

  for(auto it : f)
    sol = max(sol, it.second);
  return (sol >= k);
}

int main() {
  int st, dr, sol, mij;

  freopen ("substr.in", "r", stdin);
  freopen ("substr.out", "w", stdout);

  scanf ("%d%d", &n, &k);
  scanf ("%s", s + 1);

  put[0] = 1;
  for(int i = 1; i <= n; i++) {
    put[i] = 1LL * put[i - 1] * 26 % MOD;
    hash1[i] = (1LL * hash1[i - 1] * 26 + s[i] - 'a') % MOD;
  }
  st = 1;
  dr = n;
  sol = -1;

  while (st <= dr) {
    mij = (st + dr) / 2;
    if (check (mij) == true) {
      st = mij + 1;
      sol = mij;
    }
    else
      dr = mij - 1;
  }

  printf ("%d\n", sol);

  return 0;
}