Cod sursa(job #2728719)

Utilizator PetyAlexandru Peticaru Pety Data 23 martie 2021 17:04:06
Problema Substr Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
	
#include <bits/stdc++.h>
#define ll long long
#define ld long double
 
using namespace std;
 
const int mod = 1e9 + 9;
 
ifstream fin ("substr.in");
ofstream fout ("substr.out");

int logpow(int a, int b) {
  int ans = 1, d = a;
  while (b) {
    if (b & 1)
      ans = 1LL * ans * d % mod;
    b >>= 1;
    d = 1LL * d * d % mod;
  }
  return ans;
}

int n, k, h[(1 << 14) + 2], pw[(1 << 14) + 2], inv[(1 << 14) + 2];
string s;

int check (int l) {
  map<int, int>mp;
  int ans = 0;
  for (int i = 0; i < n - l + 1; i++) {
    ll val = h[i + l - 1] - (i == 0 ? 0 : h[i - 1]) + mod;
    if (val >= mod)
      val -= mod;
    val = 1ll * val * inv[i] % mod;
    mp[val]++;
    ans = max(ans, mp[val]);
  }
  return (ans >= k);
}

int main()
{
  fin >> n >> k;
  fin >> s;
  int hash = 0;
  pw[0] = 1;
  for (int i = 1; i <= n; i++) 
    pw[i] = 1ll * pw[i - 1] * 37 % mod;
  inv[0] = 1;
  for (int i = 1; i <= n; i++)
    inv[i] = logpow(pw[i], mod - 2); 
  for (int i = 0; i < n; i++) {
    hash = hash + 1ll * pw[i] * (s[i] - 'a') % mod;
    if (hash >= mod)
      hash -= mod;
    h[i] = hash;
  }
  int st = 1, dr = n, ans;
  while (st <= dr) {
    int mij = (st + dr) / 2;
    if (check(mij)) {
      st = mij + 1;
      ans = mij;
    }
    else
      dr = mij - 1;
  }
  fout << ans;
  return 0;
}