Cod sursa(job #2949183)

Utilizator bem.andreiIceman bem.andrei Data 30 noiembrie 2022 08:40:00
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;
ifstream r("substr.in");
ofstream w("substr.out");

const int base = 103, mod = 666013;
int n, k;
unsigned long long put[16500], has[16500];
unordered_map <unsigned long long, int> m;
string s;

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

bool check(int len)
{
    m.clear();
    for(int i = 1; i <= n - len + 1; i++)
    {
        unsigned long long aux = has[i + len - 1] - has[i - 1] * put[len];
        m[aux]++;
    }
    for(auto it : m)
    {
        if(it.second >= k)
        {
            return 1;
        }
    }
    return 0;
}

int main()
{
    r >> n >> k;
    r >> s;
    s = '$' + s;
    put[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        put[i] = put[i - 1] * base;
        has[i] = has[i - 1] * base + get_val(s[i]);
    }
    int aux = 0;
    for(int i = (1 << 28); i; i >>= 1)
    {
        if(aux + i <= n && check(aux + i))
        {
            aux += i;
        }
    }
    w << aux << "\n";
    return 0;
}