Cod sursa(job #2966217)

Utilizator _andrei4567Stan Andrei _andrei4567 Data 16 ianuarie 2023 21:00:11
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <string>
#include <map>
#define int long long

using namespace std;

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

const int N = 16384;
const int MOD = 1e9 + 9;

int pref[N + 1], inv[N + 1];

int llpow (int a, int b)
{
    int res = 1;
    a = a % MOD;
    while (b)
    {
        if (b & 1)res = res * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return res;
}

map <int, int> m;

string s;

int n, k;

bool ok (int dist)
{
    m.clear();
    for (int i = 0; i < s.size() - dist + 1; ++i)
    {
        int j = i + dist - 1;
        int hashbun = pref[j];
        if (i)
            hashbun = (hashbun + MOD - pref[i - 1]) % MOD;
        hashbun = hashbun * inv[i] % MOD;
        m[hashbun]++;
    }
    for (auto it : m)
        if (it.second >= k)
            return 1;
    return 0;
}

int cb (int st, int dr)
{
    int last = 0;
    while (st <= dr)
    {
        int med = (st + dr) >> 1;
        if (ok (med))
        {
            st = med + 1;
            last = med;
        }
        else
            dr = med - 1;
    }
    return last;
}

int make (char ch)
{
    if (isupper (ch))
        return ch - 'A' + 1;
    if (islower (ch))
        return 'z' - 'a' + 2 + ch - 'a';
    return ('z' - 'a' + 1) * 2 + ch - '0' + 1;
}

signed main()
{
    cin >> n >> k >> s;
    int p = 1;
    int cat = llpow (71, MOD - 2);
    inv[0] = cat;
    for (int i = 0; i < s.size(); ++i, p = p * 71 % MOD)
    {
        pref[i] = p * make(s[i]) % MOD;
        if (i)
            pref[i] = (pref[i] + pref[i - 1]) % MOD, inv[i] = inv[i - 1] * cat % MOD;
    }
    cout << cb (1, n) << '\n';
    return 0;
}