Cod sursa(job #3209468)

Utilizator robert_dumitruDumitru Robert Ionut robert_dumitru Data 2 martie 2024 15:24:23
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <bits/stdc++.h>
#define P 123457
#define Q 777013
using namespace std;

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

/*
Litere mari: 0....25
Litere mici: 26...51
Cifre: 52...61
*/

int n, k;
char s[16500];
vector<pair<int, int>> v;

int Cod(char ch)
{
    if ('A' <= ch && ch <= 'Z')
        return ch - 'A';
    if ('a' <= ch && ch <= 'z')
        return 26 + ch - 'a';
    return 52 + ch - '0';
}
bool Check(int L)
{
    int i, x, x2, p, p2, fr, frMax;
    x = x2 = 0; p = p2 = 1;
    v.clear();

    for (i = 0; i < L; i++)
    {
        x = (x * 62 + Cod(s[i])) % P;
        x2 = (x2 * 62 + Cod(s[i])) % Q;
    }
    for (i = 1; i < L; i++)
    {
        p = p * 62 % P;
        p2 = p2 * 62 % Q;
    }
    v.push_back({x, x2});
    for (i = L; i < n; i++)
    {
        x = (x - Cod(s[i - L]) * p % P + P) % P;
        if (L == 1)
            cout << x << "\n";
        x = (x * 62 + Cod(s[i])) % P;

        x2 = (x2 - Cod(s[i - L]) * p2 % Q + Q) % Q;
        x2 = (x2 * 62 + Cod(s[i])) % Q;

        v.push_back({x, x2});
    }
    sort(v.begin(), v.end());

    fr = frMax = 1;
    for (i = 1; i < v.size(); i++)
        if (v[i] == v[i - 1])
        {
            fr++;
            frMax = max(frMax, fr);
        }
        else fr = 1;

    return (frMax >= k);
}

int main()
{
    int st, dr, mij, Poz;
    fin >> n >> k;
    fin >> s;
    st = 1; dr = n; Poz = -1;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (Check(mij))
        {
            Poz = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    fout << Poz << "\n";
    return 0;
}