Cod sursa(job #1198324)

Utilizator assa98Andrei Stanciu assa98 Data 15 iunie 2014 14:35:14
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

ifstream fin("substr.in");
ofstream fout("substr.out");

struct sp {
    int a, b, p;
    sp(int _a = 0, int _b = 0, int _p = 0) {
        a = _a;
        b = _b;
        p = _p;
    }
    inline bool operator < (const sp &x) const {
        if(a == x.a) {
            return b < x.b;
        }
        return a < x.a;
    }

    inline bool operator == (const sp &x) const {
        return a == x.a && b == x.b;
    }
};

const int MAX_N = 16500;
const int MAX_L = 15;

int d[MAX_L][MAX_N];

sp v[MAX_N];
string s;
int n;
int l;

void pregen() {
    for(int i = 0; i < n; i++) {
        d[0][i] = s[i];
    }
    for(l = 1; (1 << (l - 1)) < n; l++) {
        for(int i = 0; i < n; i++) {
            if(i + (1 << (l - 1)) < n) {
                v[i] = sp(d[l - 1][i], d[l - 1][i + (1 << (l -1))], i); 
            }
            else {
                v[i] = sp(d[l - 1][i], -1, i);
            }
        }

        sort(v, v + n);

        for(int i = 0; i < n; i++) {
            if(i && v[i] == v[i - 1]) {
                d[l][v[i].p] = d[l][v[i - 1].p];
            }
            else {
                d[l][v[i].p] = i;
            }
        }
    }
}

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


int main() {
    int k;
    fin >> n >> k;
    fin >> s;
    
    pregen();
   

    int ans = 0;
    for(int i = k - 1; i < n; i++) {
        ans = max(ans, LCP(v[i].p, v[i - k + 1].p));
    }

    fout << ans;
    return 0;
}