Cod sursa(job #933894)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 30 martie 2013 13:17:00
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<algorithm>
#include<cstdio>
#include<cstring>
#define NMax 100005
using namespace std;

struct entry {
    int nr[2],p;
} L[NMax];
int P[20][NMax],step,N;
char sir[NMax];

bool cmp (entry aa, entry bb)
{
    return aa.nr[0]==bb.nr[0] ? (aa.nr[1]<bb.nr[1]) : (aa.nr[0]<bb.nr[0]);
}

int lcp (int x, int y)
{
    int k,ret=0;
    if (x==y)
        return N-x;
    for (k=step-1; k>=0 && x<N && y<N; k--)
        if (P[k][x]==P[k][y])
            x+=(1<<k), y+=(1<<k), ret+=(1<<k);
    return ret;
}

int main ()
{
    int i,cnt,maxi=0,k;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d",&N,&k);
    scanf("%s",sir);
    N=strlen(sir);
    for (i=0; i<N; i++)
        P[0][i]=sir[i]-'a';
    for (step=1, cnt=1; cnt>>1 < N; step++, cnt<<=1)
    {
        for (i=0; i<N; i++)
        {
            L[i].nr[0]=P[step-1][i];
            L[i].nr[1]=i+cnt<N ? P[step-1][i+cnt] : -1;
            L[i].p=i;
        }
        sort(L,L+N,cmp);
        for (i=0; i<N; i++)
            P[step][L[i].p]=i>0 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1] ? P[step][L[i-1].p] : i;
    }
    for (i=0; i<=N-k; i++)
        maxi=max(maxi,lcp(L[i].p,L[i+k-1].p));
    printf("%d\n",maxi);
    return 0;
}