Cod sursa(job #2456683)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 15 septembrie 2019 10:14:14
Problema Substr Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 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;
    int len = s.length();
    make_hash(s, len);

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

    int i = 1, j = n / k;
    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;

}