Cod sursa(job #2021551)

Utilizator Alex18maiAlex Enache Alex18mai Data 13 septembrie 2017 22:18:17
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <iostream>
#include <map>

using namespace std;

const unsigned long long base = 197;
unsigned long long hsh[40100];
unsigned long long put[40100];
char sir[40100];
map <unsigned long long , int> M;

int main() {

    /*freopen ("input" , "r" , stdin);
    freopen ("output" , "w" , stdout);*/

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    put[0] = 1;
    for (int i=1; i<=20000; i++){
        put[i] = put[i-1];
        put[i] *= base;
    }

    int n , k;
    cin>>n>>k;

    for (int i=1; i<=n; i++){
        cin>>sir[i];
    }

    for (int i=n; i>=1; i--){
        hsh[i] = hsh[i + 1];
        hsh[i] *= base;
        hsh[i] += 1ULL * sir[i];
    }

    int st = 0;
    int dr = n;
    int ans = 0;

    while(st <= dr){
        bool gasit = false;
        int mij = (st + dr) / 2;
        for (int i=1; i<=n-mij+1; i++){
            unsigned long long h = hsh[i] - (hsh[i + mij] * put[mij]);
             M[h] ++;
        }
        for (auto x : M){
            if (x.second >= k){
                gasit = true;
                ans = mij;
                break;
            }
        }
        M.clear();
        if (gasit == true){
            st = mij + 1;
        }
        else{
            dr =  mij - 1;
        }
    }
    cout<<ans;
    return 0;
}