Cod sursa(job #2097846)

Utilizator mariusn01Marius Nicoli mariusn01 Data 1 ianuarie 2018 18:42:09
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#define DIM 17000
#define DIMH 797317
#define BAZA 1073
using namespace std;

long long H[DIMH];
long long st, dr, n, k, mid, pmax, cod;
char s[DIM];
int main () {
    ifstream fin ("substr.in");
    ofstream fout("substr.out");

    fin>>n>>k;
    fin>>s+1;

    st = 1; dr = n - k + 1;
    while (st <= dr) {
        int mid = (st + dr)/2;
        int ok = 0;
        for (int i=0;i<DIMH;i++)
            H[i] = 0;

        pmax = 1;
        for (int i=1;i<mid;i++) {
            pmax = (pmax * BAZA) % DIMH;
        }

        cod = s[1] % DIMH;
        for (int i=2;i<=mid;i++) {
            cod = (cod * BAZA + s[i]) % DIMH;
        }
        H[cod]++;

        for (int i=mid+1;i<=n;i++) {
            cod -= pmax * (s[i-mid]) % DIMH;
            if (cod < 0)
                cod += DIMH;
            cod = (cod * BAZA + s[i]) % DIMH;
            H[cod]++;
            if (H[cod] >= k) {
                ok = 1;
                break;
            }
        }

        if (ok)
            st = mid+1;
        else
            dr = mid-1;
    }

    fout<<dr;

    return 0;
}