Cod sursa(job #2601553)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 14 aprilie 2020 17:37:55
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<bits/stdc++.h>

#define MOD 103
#define NMAX 17000
using namespace std;

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

typedef unsigned long long ull;

int n, k;
ull p[NMAX], h[NMAX];
char sir[NMAX];

unordered_map<ull, int> mp;

int CONV(char s){
    if('a' <= s && s <= 'z')
        return (s - 'a');
    if('A' <= s && s <= 'Z')
        return (s - 'A' + 26);
    return (s - '0' + 52);
}

bool good(int mij){
    mp.clear();
    for(int i = 1; i <= n - mij + 1; ++i){
        ull ax = h[i + mij - 1] - h[i - 1] * p[mij];
        mp[ax]++;
    }

    for(auto it: mp)
        if(it.second >= k)
            return 1;
    return 0;
}

int main()
{
    fin >> n >> k;

    fin.get();
    fin >> (sir + 1);

    p[0] = 1;
    for(int i = 1; i <= n; ++i){
        p[i] = p[i - 1] * MOD;
        h[i] = (h[i - 1] * MOD + CONV(sir[i]) + 1);
    }

    int st = 0;
    int rez = 0;
    int dr = n;
    while(st <= dr){
        int mij = (st + dr) / 2;
        if(good(mij))
            rez = mij, st = mij + 1;
        else dr = mij - 1;
    }
    fout << rez << '\n';
    return 0;
}