Cod sursa(job #1990006)

Utilizator livliviLivia Magureanu livlivi Data 9 iunie 2017 21:37:00
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>
#include<algorithm>
#include<utility>
#define P 15
#define N (1<<P)
using namespace std;

int suf[P+1][N+1];

pair<pair<int,int>,int> v[N+1];

char s[N+1];

void solve(int n){
    int i,j;

    for(i=0;i<n;i++)
        suf[0][i+1]=s[i];

    for(i=1;i<P;i++){
        for(j=1;j<=n;j++)
            v[j]={{suf[i-1][j],suf[i-1][j+(1<<(i-1))]},j};

        sort(v+1,v+n+1);

        for(j=1;j<=n;j++)
            suf[i][v[j].second]=suf[i][v[j-1].second]+(v[j].first!=v[j-1].first);
    }
}

int lcp(int i,int j){
    int r=0,p=P-1;

    while(p>=0){
        if (suf[p][i]==suf[p][j]){
            i+=(1<<p);
            j+=(1<<p);
            r+=(1<<p);
        }
        p--;
    }

    return r;
}

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

    scanf ("%d%d\n",&n,&k);

    gets(s);
    solve(n);

    int ans=0;

    for(i=1;i+k-1<=n;i++)
        ans=max(ans,lcp(v[i].second,v[i+k-1].second));

    printf ("%d",ans);
    return 0;
}