Cod sursa(job #2790587)

Utilizator Stefan_BircaBirca Stefan Stefan_Birca Data 29 octombrie 2021 11:38:21
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define P 45999139

using namespace std;

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

unordered_map<int, int> M;

char text[16400];
int n, k, p62[16385]; ///p62[i] = 52^i

void Make62()
{
    p62[0] = 1;
    for (int i = 1; i <= 16384; i++)
        p62[i] = 1LL * p62[i - 1] * 62 % P;
}

int Code(char c)
{
    if (c <= '9') return c - '0';
    if (c <= 'Z') return c - 'A' + 10;
    return c - 'a' + 36;
}

bool Verif(int L)
{
    M.clear();
    int i, x = 0, e;
    e = p62[L - 1];
    ///formez primul sir de lungime L, modulo P
    for (i = 0; i < L; i++)
        x = (1LL * x * 62 + Code(text[i])) % P;
    M[x]++;
    for (; text[i] != 0; i++)
    {
        x = ((x - 1LL * Code(text[i - L]) * e % P + P) * 62 + Code(text[i])) % P;
        M[x]++;
        if (M[x] >= k) return 1;
    }
    return 0;
}

/// Cauta lungimea maxima L pe care o poate avea o secv care apare de cel putin k ori in text
int CautBin()
{
    int st, dr, L, mid;
    st = 1;
    L = dr = n - k + 1;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (Verif(mid))
        {
            L = mid;
            st = mid + 1;
        }
        else dr = mid - 1;
    }
    return L;
}

int main()
{

    Make62();
    fin >> n >> k;
    fin >> text;
    fout << CautBin();

    fout.close();

    return 0;
}