Cod sursa(job #1884874)

Utilizator cristina_borzaCristina Borza cristina_borza Data 19 februarie 2017 13:47:01
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <cstring>
#include <map>

#define MOD 1000000007
#define BASE 30
#define DIM 20000

using namespace std;

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

long long n, k, pw[DIM], h[DIM];
char s[DIM];

map <int, int> mp;

void prec () {
    pw[0] = 1;
    for (int i = 1; i <= n; ++i) {
        pw[i] = (pw[i - 1] * BASE) % MOD;
        h[i] = (h[i - 1] * BASE + (s[i] - 'a')) % MOD;
    }
}

bool verif (int lg) {
    mp.clear ();
    mp[h[lg]] = 1;

    for (int i = lg + 1; i <= n; ++i) {
        long long qw = (h[i] - (h[i - lg] * pw[lg]) % MOD + MOD) % MOD;
        ++mp[(int) qw];

        if (mp[(int) qw] >= k)
            return 1;
    }

    return 0;
}

int cbin () {
    int i, p = 0;
    prec ();

    for (i = 1; i <= n; i <<= 1);
    while (i) {
        if (i + p <= n && verif (i + p) == 1) {
            p += i;
        }

        i >>= 1;
    }

    return p;
}

int main() {
    f >> n >> k >> (s + 1);
    g << cbin ();
    return 0;
}