Cod sursa(job #1884861)

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

#define BASE 73

#define MOD1 561307
#define MOD2 666013

#define DIM 20000

using namespace std;

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

int n, k, v[DIM];
char sir[DIM];

map <pair <int, int>, int> mp;

bool verif (int lg) {
    int h1 = 0, h2 = 0;
    int p1 = 1, p2 = 1;
    mp.clear ();

    for (int i = 1; i <= lg; ++i) {
        h1 = (h1 * BASE + v[i]) % MOD1;
        h2 = (h2 * BASE + v[i]) % MOD2;

        if (i != 1) {
            p1 *= BASE;
            p1 %= MOD1;

            p2 *= BASE;
            p2 %= MOD2;
        }
    }

    mp[make_pair (h1, h2)] = 1;
    for (int i = lg + 1; i <= n; ++i) {
        long long qw;
        qw = (((h1 - (v[i - lg] * p1) % MOD1 + MOD1) % MOD1) * BASE + v[i]) % MOD1;
        h1 = (int) qw;

        qw = (((h2 - (v[i - lg] * p2) % MOD2 + MOD2) % MOD2) * BASE + v[i]) % MOD2;
        h2 = (int) qw;

        ++mp[make_pair (h1, h2)];
        if (mp[make_pair (h1, h2)] >= k)
            return 1;
    }

    return 0;
}

int cbin () {
    int i, p = 0;
    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 >> (sir + 1);
    for (int i = 1; i <= n; ++i) {
        if (sir[i] >= '0' && sir[i] <= '9')
            v[i] = sir[i] - '0';

        if (sir[i] >= 'a' && sir[i] <= 'z')
            v[i] = sir[i] - 'a' + 10;

        if (sir[i] >= 'A' && sir[i] <= 'Z')
            v[i] = sir[i] - 'A' + 26;
    }

    g << cbin ();
    return 0;
}