Cod sursa(job #2794586)

Utilizator CatalinCosminGirgoriu Cosmin CatalinCosmin Data 5 noiembrie 2021 10:00:44
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define P 33333331
using namespace std;
/**
0-9
A-Z : 10...35
a-z : 36...61
*/

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

unordered_map <int, int> M;
char text[16400];
int n, k, p62[16385]; /// p62[i] = 62 ^ i

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

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

int Verifica(int L)
{
    M.clear();
    int x = 0, cod, i;
    for (i = 0; i < L; i++)
    {
        cod = Cod(text[i]);
        x = (1LL * x * 62 + cod) % P;
    }
    M[x]++;
    if (M[x] >= k)
        return 1;
    for (; text[i]; i++)
    {
        x = ((x - 1LL * Cod(text[i - L]) * p62[L - 1] % P + P) * 62 % P + Cod(text[i])) % P;
        M[x]++;
        if (M[x] >= k)
            return 1;
    }
    return 0;
}

int CautBin()
{
    int st, dr, L, mid;
    st = 1;
    L = 0;
    dr = n - k + 1;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (Verifica(mid))
        {
            L = mid;
            st = mid + 1;
        }
        else dr = mid - 1;
    }
    return L;
}


int main()
{
    fin >> n >> k;
    fin >> text;
    Make62();
    fout << CautBin() << "\n";
    return 0;
}