Cod sursa(job #2021567)

Utilizator Alex18maiAlex Enache Alex18mai Data 13 septembrie 2017 22:33:39
Problema Substr Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <map>

using namespace std;

ifstream cin("substr.in");
ofstream cout("substr.out");

const unsigned long long base = 197;
unsigned long long hsh[16500];
unsigned long long put[16500];
char sir[16500];
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<=16500; 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){
        //cout<<st<<" "<<dr<<'\n';
        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){
            //cout<<x.first<<" "<<x.second<<'\n';
            if (x.second >= k){
                gasit = true;
                ans = mij;
                break;
            }
        }
        M.clear();
        if (gasit == true){
            st = mij + 1;
        }
        else{
            if (st == dr){
                break;
            }
            dr =  mij;
        }
    }
    cout<<ans;
    return 0;
}