Cod sursa(job #3258850)

Utilizator andreic06Andrei Calota andreic06 Data 23 noiembrie 2024 20:58:35
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;
using int64 = long long;

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


const int N_MAX = (1 << 16);
int N, K; string input;

const int MOD = 1e9 + 7;
const int BASE = 27;
int h[1 + N_MAX]; int p[N_MAX];

static inline int add (int a, int b) {
    if (a + b >= MOD) return a + b - MOD;
    if (a + b < 0) return a + b + MOD;
    return a + b;
}
static inline int prod (int a, int b) {
    int ret = (int64) a * b % MOD;
    return ret;
}

void readInput (void) {
    in >> N >> K; in >> input;
    for (int i = 1; i <= N; i ++)
       h[i] = add (prod (h[i - 1], BASE), input[i - 1] - 'a' + 1);
    p[0] = 1;
    for (int e = 1; e < N_MAX; e ++) p[e] = prod (p[e - 1], BASE);
}

static inline int getHash (int le, int ri) {
   return add (h[ri], -prod (h[le - 1], p[ri - le + 1]));
}

map<int, int> counter;
bool valid (int len) {
   int ret = 0;
   for (int i = 0; i <= N - len; i ++)
      counter[getHash (i, i + len - 1)] ++;
   for (auto T : counter) ret = max (ret, T.second);
   return (ret >= K);
}

void solve (void) {
    int low = 1, high = N;
    int answer = 0;
    while (low <= high) {
       int mid = low + (high - low) / 2;
       if (valid (mid)) answer = mid, low = mid + 1;
       else high = mid - 1;
    }
    out << answer;
}
int main()
{
   readInput ();
   solve ();
    return 0;
}