Cod sursa(job #1884878)

Utilizator cristina_borzaCristina Borza cristina_borza Data 19 februarie 2017 13:56:53
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#include <cstring>
#include <unordered_map>

#define DIM 20000

using namespace std;

const long long MOD = 1e9 + 7;
const long long BASE = 30;

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

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

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

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

bool verif (int lg) {
    unordered_map <long long, int> mp;
    mp[h[lg]] = 1;
    if (mp[h[lg]] >= k)
        return 1;

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

        if (mp[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;
}