Cod sursa(job #2053632)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 31 octombrie 2017 23:15:38
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct Label {
    int nr1, nr2, poz;

    bool operator < (Label other) const {
        if(nr1 == other.nr1) {
            return nr2 < other.nr2;
        }
        return nr1 < other.nr1;
    }

    bool operator == (Label other) const {
        return nr1 == other.nr1 && nr2 == other.nr2;
    }
};

char s[17000];
int P[20][17000], cnt, stp;
Label L[17000];

int myCharToInt(char x) {
    if('0' <= x && x <= '9') {
        return x - '0';
    } else if('a' <= x && x <= 'z') {
        return x - 'a' + 10;
    } else {
        return x - 'A' + 36;
    }
}

int lcp(int x, int y, int n) {
    int sol = 0;
    if(x == y) {
        return n - x;
    }

    for(int k = stp - 1; k >= 0 && x < n && y < n; -- k) {
        if(P[k][x] == P[k][y]) {
            x += (1 << k);
            y += (1 << k);
            sol += (1 << k);
        }
    }
    return sol;
}

int main() {
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);

    int n, k;

    scanf("%d%d\n", &n, &k);
    gets(s);

    for(int i = 0; i < n; ++ i) {
        P[0][i] = myCharToInt(s[i]);
    }

    for(cnt = 1, stp = 1; (cnt >> 1) < n; cnt <<= 1, ++ stp) {
        for(int i = 0; i < n; ++ i) {
            L[i] = {P[stp - 1][i], i + cnt < n ? P[stp - 1][i + cnt] : -1, i};
        }
        sort(L, L + n);
        for(int i = 0; i < n; ++ i) {
            P[stp][L[i].poz] = i;
            if(i > 0 && L[i] == L[i - 1]) {
                P[stp][L[i].poz] = P[stp][L[i - 1].poz];
            }
        }
    }

    int rasp = 0;
    for(int i = 0; i + k - 1 < n; ++ i) {
        int aux = lcp(L[i].poz, L[i + k - 1].poz, n);
        if(aux > rasp) {
            rasp = aux;
        }
    }

    printf("%d\n", rasp);

    return 0;
}