Cod sursa(job #1402056)

Utilizator addy01adrian dumitrache addy01 Data 26 martie 2015 11:56:49
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <iostream>
#include <fstream>
#include <tr1/unordered_map>

using namespace std;

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

const int MAXN = 16384 + 10;
const int power = 137;
const int MOD = 666013;

int N, K;
char S[MAXN];
int P[MAXN];
tr1 :: unordered_map <int, int> M;

bool ok (int len)
{
    M.clear ();
    int hash = 0, i;
    int Ans = 1;

    for (i = 0; i < len; i ++)
        hash = (hash * power + S[i]) % MOD;

    M[hash] ++;
    for (i = len; i < N; i ++){
        hash = (hash - S[i - len] * P[len - 1] + MOD) % MOD;
        hash = (hash * power + S[i]) % MOD;

        M[hash] ++;
        if (M[hash] > Ans)
            Ans = M[hash];
    }

    return (Ans >= K);
}

int bsearch ()
{
    int step, i = 0;

    for (step = 1; step < N; step *= 2);
        for ( ; step; step /= 2)
            if (i + step <= N && ok (i + step))
                i += step;

    return i;
}

int main()
{
    in >> N >> K;
    in >> S;

    P[0] = 1;
    for (int i = 1; i <= N; i ++)
        P[i] = (P[i - 1] * power) % MOD;

    out << bsearch ();

    return 0;
}