Cod sursa(job #1188969)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 20 mai 2014 22:26:35
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIMN 17000

using namespace std;

ifstream f("substr.in");
ofstream g("substr.out");

int n, kt, k, pas, val, Max;

int P[17][DIMN];

struct data {
    int x;
    int y;
    int poz;
} L[DIMN];

pair<int,int> v[DIMN];

char A[DIMN];

int LCP (int i, int j) {
    int res = 0;
    if (i == j)
        return n-i;
    for (int k = pas; k >= 0 && i<n && j<n; --k)
        if (P[k][i] == P[k][j]) {
            i += (1<<k);
            j += (1<<k);
            res += (1<<k);
        }
    return res;
}

bool cmp (const data &a, const data &b) {
    return a.x == b.x ? a.y < b.y : a.x < b.x;
}

int main() {
    f>> n >> kt;
    f.ignore( 10, '\n' );
    f.getline( A, DIMN );
    for (int i = 0; A[i] != 0; ++i)
        if (A[i]>='a' && A[i]<='z')
            P[0][i] = A[i] - 'a';
        else
            if (A[i]>='A' && A[i]<='Z')
                P[0][i] = A[i] - 'A' + 26;
                    else
                        P[0][i] = A[i] - '0' + 52;
    for (pas = 1, k = 1; (k>>1) < n; ++pas, k <<= 1) {
        for (int i = 0; i < n; ++i) {
            L[i].x = P[pas-1][i];
            L[i].y = (i + k < n) ? P[pas-1][i+k] : -1;
            L[i].poz = i;
        }
        sort (L, L+n, cmp);
        for (int i = 0; i < n; ++i)
            if ( i>0 && L[i-1].x == L[i].x && L[i-1].y == L[i].y )
                P[pas][L[i].poz] = P[pas][L[i-1].poz];
            else
                P[pas][L[i].poz] = i;
    }
    --pas;
    for (int i = 0; i < n; ++i) {
        v[i].first = P[pas][i];
        v[i].second = i;
    }
    sort(v, v+n);
    for (int i = 0; i<=n-kt; ++i) {
        val = LCP ( v[i].second, v[i+kt-1].second );
        Max = max (Max, val);
    }
    g<<Max<<"\n";
    return 0;
}