Cod sursa(job #355088)

Utilizator CezarMocanCezar Mocan CezarMocan Data 10 octombrie 2009 10:30:44
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#include <algorithm>
#define maxn 17027

using namespace std;

struct balooba {
    int f, s, p;  
};

int n, i, j, k, p2, sol;
int p[20][maxn];
char s[2 * maxn];
balooba l[maxn];
int x[maxn];

bool cmp(balooba a, balooba b) {
    if (a.f < b.f || (a.f == b.f && a.s < b.s))
        return true;
    return false;
}

bool cmp2(int a, int b) {
    if (p[p2][a] < p[p2][b])
        return true;
    return false;
}

int lcp(int x, int y) {
    int rez = 0;
    for (int cnt = p2; cnt >= 0 && x < n && y < n; cnt--) 
        if (p[cnt][x] == p[cnt][y]) {
            x += (1 << cnt); y += (1 << cnt);
            rez += (1 << cnt);    
        }    
    return rez;
}

int main(){
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
    
    scanf("%d%d", &n, &k);
    scanf(" %s ", s);
    
    for (i = 0; i < n; i++)
        p[0][i] = s[i] - 'a';
        
    for (i = 1; (1 << i) <= n; i++) {
        for (j = 0; j < n; j++) {
            l[j].f = p[i - 1][j];
            l[j].s = p[i - 1][j + (1 << (i - 1))];   
            l[j].p = j;
        }
        
        sort(l, l + n, cmp);
        
        p[i][l[0].p] = 0;
        for (j = 1; j < n; j++)
            if (l[j].f == l[j - 1].f && l[j].s == l[j - 1].s)
                p[i][l[j].p] = p[i][l[j - 1].p];
            else
                p[i][l[j].p] = j;
    }
    
    p2 = i - 1;

    for (i = 0; i < n; i++)
        x[i] = i;
        
    sort(x, x + n, cmp2);
    
/*    for (i = 0; i < n; i++)
        printf("%d ", x[i]);
    printf("\n");*/
    
    for (i = 0; i < n - k; i++) {
//        printf("%d %d  %d\n", x[i], x[i + k - 1], lcp(x[i], x[i + k - 1]));
        sol = max(sol, lcp(x[i], x[i + k - 1]));
    }
    
    printf("%d\n", sol);

    return 0;
}