Cod sursa(job #3134466)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 29 mai 2023 07:55:03
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <unordered_map>

using namespace std;

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

const int max_size = 16385, baza = 29, mod = 1e9 + 7;

int v[max_size], n, k;

bool check (int l)
{
    unordered_map <long long, int> m;
    long long hsh = 0, ptr = 1;
    for (int i = 1; i <= l; i++)
    {
        hsh = (hsh * baza + v[i]) % mod;
        if (i < l)
        {
            ptr = (ptr * baza) % mod;
        }
    }
    for (int i = l + 1; i <= n + 1; i++)
    {
        m[hsh]++;
        if (m[hsh] == k)
        {
            return true;
        }
        if (i == n + 1)
        {
            continue;
        }
        hsh -= (v[i - l] * ptr) % mod;
        while (hsh < 0)
        {
            hsh += mod;
        }
        hsh = (hsh * baza + v[i]) % mod;
    }
    return false;
}

int main ()
{
    in >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        char ch;
        in >> ch;
        v[i] = (ch - 'a') + 1;
    }
    int l = 1, r = n, ans = 0;
    while (l <= r)
    {
        int m = (l + r) / 2;
        if (check(m))
        {
            l = m + 1;
            ans = m;
        }
        else
        {
            r = m - 1;
        }
    }
    out << ans;
    in.close();
    out.close();
    return 0;
}