Cod sursa(job #1509575)

Utilizator retrogradLucian Bicsi retrograd Data 24 octombrie 2015 05:41:59
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

int Sort[100000];
char str[100000];
int Class[17][50000];
pair<int, int> Aux[50000];
int n;

void build_array() {
    for(int i=1; i<=n; i++)
        Sort[i] = i;
    sort(Sort+1, Sort+n+1, [](int a, int b) {return str[a] < str[b];});
    for(int i=1; i<=n; i++)
        Class[0][Sort[i]] = Class[0][Sort[i-1]] + (str[Sort[i]] != str[Sort[i-1]]);

    for(int i=1; (1 << i) <= (n << 1); i++) {
        for(int j=1; j<=n; j++)
            Aux[j] = {Class[i-1][j], Class[i-1][j + (1 << (i-1))]};
        sort(Sort+1, Sort+n+1, [](int a, int b) { return Aux[a] < Aux[b]; });
        for(int j=1; j<=n; j++)
            Class[i][Sort[j]] = Class[i][Sort[j-1]] + (Aux[Sort[j]] != Aux[Sort[j-1]]);
    }
}

int lcp(int i, int j) {
    int step, sol = 0;
    i = Sort[i]; j = Sort[j];

    for(step=0; (1<<step) <= n; step++);
    for(; step>=0; step--) {
        if(Class[step][i] == Class[step][j]) {
            sol += (1 << step);
            i += (1 << step);
            j += (1 << step);
        }
    }
    //cerr<<sol;
    return sol;
}

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

    int k;
    cin>>n>>k>>str+1;
    if(k == 1) { cout<<n; return 0; }
    build_array();
    //for(int i=1; i<=n; i++) cerr<<Sort[i]<<" "; cerr<<endl;

    int best = 0;
    for(int i=k; i<=n; i++)
        best = max(best, lcp(i-k+1, i));
    cout<<best;



    return 0;
}