Cod sursa(job #2595759)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 8 aprilie 2020 12:56:23
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod(1e9 + 9), baza(67), N(17000);
int n, k, Hash[N], p[N], res, curr, st, dr, mid;
long long aux;
string s;
unordered_map<int, int> M;
inline bool Check(int l) {
    M.clear();
    for (int i = 0; i <= n - l; ++i) {
        aux = 1LL * (Hash[i + l] + mod - Hash[i]) * p[n - i - 1];
        curr = aux % mod;
        ++M[curr];
    }
    for (const auto& P : M)
        if (P.second >= k)
            return true;
    return false;
}
inline int CHASH(char c) {
    if ('a' <= c && c <= 'z')
        return static_cast<int>(c - 'a');
    if ('A' <= c && c <= 'Z')
        return static_cast<int>(c - 'A' + 27);
    if ('0' <= c && c <= '9')
        return static_cast<int>(c - '0' + 54);
}
int main() {
    fin >> n >> k >> s;
    fin.close();
    p[0] = 1;
    for (int i = 1; i <= n; ++i) {
        aux = 1LL * p[i - 1] * baza;
        p[i] = aux % mod;
    }
    for (int i = 0; i < n; ++i) {
        aux = Hash[i] + 1LL * CHASH(s[i]) * p[i];
        Hash[i + 1] = aux % mod;
    }
    st = 0, dr = n;
    while (st <= dr) {
        mid = (st + dr) / 2;
        if (Check(mid))
            res = mid, st = mid + 1;
        else dr = mid - 1;
    }
    fout << res;
    fout.close();
    return 0;
}