Cod sursa(job #1746890)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 24 august 2016 02:55:27
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 22000,
          LMAX = 20;

struct AUX {
    int c1, c2, pos;
};

int len, lg, k;

AUX l[NMAX];
int p[LMAX][NMAX];

char str[NMAX];

bool cmp(const AUX &a, const AUX &b) {
    if(a.c1==b.c1)
        return a.c2<b.c2;
    else
        return a.c1<b.c1;
}

void make_sfx(void) {
    for(int i=0; i<len; ++i)
        p[0][i] = str[i];

    for(lg=1; (1 << lg) < len; ++lg) {
        for(int i=0; i<len; ++i) {
            l[i].pos = i;
            l[i].c1  = p[lg - 1][i];
            if(i + (1 << lg - 1) < len)
                l[i].c2 = p[lg - 1][i + (1 << lg - 1)];
            else
                l[i].c2 = -1;
        }

        sort(l, l+len, cmp);

        for(int i=0; i<len; ++i) {
            if(i && l[i].c1==l[i - 1].c1 && l[i].c2==l[i - 1].c2)
                p[lg][l[i].pos] = p[lg][l[i-1].pos];
            else
                p[lg][l[i].pos] = i;
        }
    } --lg;
}

int lcp(int x, int y) {
    int k, ret = 0;
    if (x == y) return len - x;
    for (k = lg - 1; k >= 0 && x < len && y < len; --k)
        if (p[k][x] == p[k][y])
            x += 1 << k, y += 1 << k, ret += 1 << k;
    return ret;
}

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

    ant = 0;

    scanf("%d%d ",&len,&k);
    gets(str);

    make_sfx();

    for(int i=0; i<len-k; ++i)
        ant = max(ant, lcp(l[i].pos, l[i+k-1].pos));

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

    fclose(stdin);
    fclose(stdout);
}