Cod sursa(job #1082997)

Utilizator WyvernFMI Stanescu Leonard Wyvern Data 15 ianuarie 2014 14:49:15
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.12 kb
#include<cstdio>
#include<algorithm>
#include<utility>
#define Nm (1<<15)
using namespace std;
char S[Nm];
int P[16][Nm],n,k,stp,ans;
struct entry{int p;pair<int,int>nr;} L[Nm];
bool cmp(entry a, entry b){return a.nr<b.nr;}
int lcp(int a, int b) {
    int r=0,k;

    for(k=stp-1;k>=0 && a<n && b<n;--k)
        if(P[k][a]==P[k][b])
            a+=1<<k, b+=1<<k, r+=1<<k;
    return r;
}
void solve(){
    int cnt,i;
    if(k==1){ans=n;return;}
    for(i=0;i<n;++i)
        P[0][i]=S[i];
    for(stp=1,cnt=1;cnt<n;++stp,cnt<<=1){
        for(i=0;i<n;++i){
            L[i].p=i;
            L[i].nr=make_pair(P[stp-1][i],i+cnt<n?P[stp-1][i+cnt]:-1);
        }
        sort(L,L+n,cmp);
        P[stp][L[0].p]=0;
        for(i=1;i<n;++i)
            P[stp][L[i].p]=L[i].nr==L[i-1].nr?P[stp][L[i-1].p]:i;
    }
    for(i=0;i<=n-k;++i){
        cnt=lcp(L[i].p,L[i+k-1].p);
        if(cnt>ans)
            ans=cnt;
    }
}
int main() {
    freopen("substr.in","r",stdin);
    scanf("%d%d ",&n,&k);
    gets(S);
    solve();
    freopen("substr.out","w",stdout);
    printf("%d\n",ans);
    return 0;
}