Cod sursa(job #3259391)

Utilizator AdrianRosuRosu Adrian Andrei AdrianRosu Data 26 noiembrie 2024 10:37:18
Problema Substr Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>
#define int unsigned int
#define DIM 17000
#define BASE 666013

using namespace std;

ifstream fin("substr.in");

ofstream fout("substr.out");

map <int, int> mp;

string s;

int _hash[DIM], power[DIM];

int n, i, k, st, dr, mij, ret;

void Build_Hash(){

    power[0] = 1;

    for(i=1;i<=n;i++)

        power[i] = power[i - 1] * BASE;

    _hash[1] = s[0];

    for(i=2;i<=n;i++)

        _hash[i] = _hash[i - 1] * BASE + s[i];

}

int get_hash(int st, int dr){

    return (_hash[dr] - _hash[st - 1] * power[dr - st + 1]);

}

bool check(int ret){

    mp.clear();

    for(i=1;i<s.size()-ret;i++){

        mp[get_hash(i, i + ret - 1)]++;

        if(mp[get_hash(i, i + ret - 1)] >= k)

            return true;

    }

    return false;

}

int32_t main(){

    fin >> n >> k >> s;

    Build_Hash();

    st = 1, dr = n;

    while(st <= dr){

        mij = (st + dr) >> 1;

        if(check(mij)){

            ret = mij;

            st = mij + 1;

        }

        else dr = mij - 1;

    }

    fout << ret;

}