Cod sursa(job #1459499)

Utilizator retrogradLucian Bicsi retrograd Data 10 iulie 2015 01:08:50
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;
typedef int var;

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

#define MAXN 50000
#define B 9907
int64_t Part[MAXN], Pow[MAXN];
char str[MAXN];
var n, k;

int64_t getHash(var e, var l) {
    return Part[e] - Pow[l] * Part[e-l];
}

unordered_map<int64_t, var> Map;
bool good(var l) {
    Map.clear();
    for(var i=l; i<=n; i++)
        Map[getHash(i, l)]++;

    for(auto p : Map)
        if(p.second >= k)
            return true;
    return false;
}

int main() {

    fin>>n>>k>>str+1;
    str[0] = '#';

    Pow[0] = 1;
    for(var i=1; i<=n; i++) {
        Part[i] = Part[i-1] * B + str[i];
        Pow[i] = Pow[i-1] * B;
    }

    var i, sol = 0;
    for(i=1; i<=n; i<<=1);
    for(; i; i>>=1)
        if(sol + i <= n && good(sol + i))
            sol += i;

    fout<<sol;
    return 0;
}