Cod sursa(job #1716535)

Utilizator MaarcellKurt Godel Maarcell Data 12 iunie 2016 23:54:55
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

struct elem{
    int nr[2],p;
} L[20000];

int N,K,P[17][20000],stp,cnt; char s[20000];

bool cmp(const elem A, const elem B){
    if (A.nr[0]==B.nr[0]) return A.nr[1]<B.nr[1];
    return A.nr[0]<B.nr[0];
}

void build_arr(){
    int i;
    for (i=1; i<=N; i++) P[0][i]=s[i]-'a';

    for (stp=1, cnt=1; (cnt>>1) <N; stp++,cnt<<=1){
        for (i=1; i<=N; i++){
            L[i].nr[0]=P[stp-1][i];
            L[i].nr[1]=i+cnt<=N ? P[stp-1][i+cnt] : -1;
            L[i].p=i;
        }
        sort(L+1,L+N+1,cmp);

        for (i=1; i<=N; i++)
            P[stp][L[i].p]= i>1 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1] ? P[stp][L[i-1].p] : i;
    }
}

int lcp(int x, int y){
    if (x==y) return N-x+1;
    int i,res=0;

    for (i=stp-1; i>=0 && x<=N && y<=N; i--){
        if (P[i][x]==P[i][y])
            res+=(1<<i),x+=(1<<i),y+=(1<<i);
    }

    return res;
}

int main(){
    ifstream fin("substr.in");
    ofstream fout("substr.out");
    fin >> N >> K;

    int i;
    for (i=1; i<=N; i++)
        fin >> s[i];
    build_arr();

    int res=0;
    for (i=1; i<=N-K+1; i++)
        res=max(res,lcp(L[i].p,L[i+K-1].p));

    fout << res << "\n";

    return 0;
}