Cod sursa(job #1075459)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 8 ianuarie 2014 23:42:50
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.9 kb
#include <cstdio>
#include <algorithm>
 
 
#define MAXN 16500
#define MAXLOG 17
 
using namespace std;
 
 
struct lol {
    int nr[2], pos;
} L[MAXN];
int P[MAXLOG][MAXN], step;
int N, K, sol;
char s[MAXN];
inline bool cmp(const lol &a, const lol &b) {
    return a.nr[0] == b.nr[0] ? a.nr[1] < b.nr[1] : a.nr[0] < b.nr[0];
}
inline int lcp(int x, int y) {
    if(x == y) return N - x;
     
    int res = 0;
    for(int i = step; i >= 0 && x < N && y < N; i--) {
    //  printf("%d %d %d\n", i, P[i][x], P[i][y]);
        if(P[i][x] == P[i][y]) {
            int v = (1 << i);
    //      printf("%d %d %d %d %d %d\n", i, x, y, v, P[i][x], P[i][y]);
            x += v;
                y += v;
                res += v;
        }
    }
    return res;
}
int main() {
 
    freopen("substr.in", "r", stdin);
    freopen("substr.out", "w", stdout);
 
    scanf("%d %d\n", &N, &K);
 
    fgets(s, MAXN, stdin);
 
    for(int i = 0; i < N; i++)
        P[0][i] = s[i] - 'a';
     
    int cnt;
     
    for(step = 1, cnt = 1; (cnt >> 1) < N; cnt <<= 1, step++) {
        for(int i = 0; i < N; i++) {
            //unite the bastards
            L[i].nr[0] = P[step - 1][i];
            if(i + cnt < N) L[i].nr[1] = P[step - 1][i + cnt];
            else L[i].nr[1] = -1;
         
            L[i].pos = i;
        }
        sort(L, L + N, cmp);
         
        //make sure of duplicates
        for(int i = 0; i < N; i++)
            P[step][L[i].pos] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[step][L[i - 1].pos] : i;
    }
     
    step -= 1;
#ifdef DEBUG
    printf("%d\n", step);
    for(int i = 0; i < N; i++)
        printf("%d ", L[i].pos);
    printf("\n");
     
    printf("%d\n", lcp(2, 11));
    return 0;
#endif
    for(int i = 0; i < N - K + 1; i++) {
    //  printf("%d\n", L[i].pos);
        sol = max(sol, lcp(L[i].pos, L[i + K - 1].pos));
    }
    printf("%d\n", sol);
 
    return 0;
}