Cod sursa(job #2237989)

Utilizator lucametehauDart Monkey lucametehau Data 4 septembrie 2018 08:51:30
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
#include <unordered_map>

using namespace std;

ifstream cin ("substr.in");
ofstream cout ("substr.out");

const int NMAX = (1 << 14);
const int MOD = 100003;
const int P = 26;

int n, k;

char s[1 + NMAX];
int hash1[1 + NMAX];
int put[1 + NMAX];

bool ok(int lg) {
  int sol = 1;
  unordered_map <int, int> f;
  f[hash1[lg]]++;
  for(int i = lg + 1; i <= n; i++) {
    int h = (hash1[i] - (1LL * hash1[i - lg] * put[lg]) % MOD + MOD) % MOD;
    f[h]++;
  }
  for(auto it : f)
    sol = max(sol, it.second);
  return (sol >= k);
}

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

int main() {
  cin >> n >> k >> (s + 1);
  put[0] = 1;
  for(int i = 1; i <= n; i++) {
    put[i] = put[i - 1] * P % MOD;
    hash1[i] = (hash1[i - 1] * P + s[i] - 'a') % MOD;
  }
  cout << cb(1, n);
  return 0;
}