Cod sursa(job #2456680)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 15 septembrie 2019 09:44:07
Problema Substr Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>
#define maxim 16389

using namespace std;

ifstream f("substr.in");
ofstream g("substr.out");

unsigned long long p[maxim], bpow[maxim];
const int B = 197;
map <unsigned long long, int> fv;

void make_hash(string s, int len)
{
    for (int i = 1; i < len ; ++ i)
        p[i] = p[i - 1] * B + s[i];
}

bool ok (int m, int len, int k)
{
   for (int end = m; end < len; ++ end)
   {
       unsigned long long h = p[end] - p[end - m] * bpow[m];
       fv[h] ++;
       if (fv[h] == k)
           return true;
   }
   return false;
}

int main()
{
  int n, k;
  string s;
  f >> n >> k;
  f >> s;
  s = '!' + s;

  bpow[0] = 1;
  for (int i = 1; i < maxim; ++ i)
        bpow[i] = bpow[i - 1] * B;

  int len = s.length();
  make_hash(s, len);

  int i = 1, j = n / k + 1;
  int ans = 0;
  while (i <= j)
  {
      fv.clear();
      int m = (i + j) / 2;
      if (ok(m, len, k))
      {
          ans = m;
          i = m + 1;
      }
      else
          j = m - 1;
  }
  g << ans;
  return 0;

}