Cod sursa(job #2933008)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 4 noiembrie 2022 14:47:08
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
/// Preset de infoarena
#include <fstream>
#include <unordered_map>

using namespace std;

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

const int base = 63, mod = 666013;
int n, k;
unsigned long long pow[16500], hsh[16500];
unordered_map <unsigned long long, int> mp;
string str;

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)
{
    mp.clear();
    for(int i = 1; i <= n - len + 1; i++)
    {
        unsigned long long aux = hsh[i + len - 1] - hsh[i - 1] * pow[len];
        mp[aux]++;
    }
    for(auto it : mp)
        if(it.second >= k)
            return 1;
    return 0;
}

int main()
{
    fin >> n >> k;
    fin >> str;
    str = '$' + str;
    pow[0] = 1;
    for(int i = 1; i <= n; i++)
    {
        pow[i] = pow[i - 1] * base;
        hsh[i] = hsh[i - 1] * base + get_val(str[i]);
    }
    int aux = 0;
    for(int i = (1 << 28); i; i >>= 1)
        if(aux + i < n && check(aux + i))
            aux += i;
    fout << aux << '\n';
    return 0;
}