Cod sursa(job #426092)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 26 martie 2010 13:50:21
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <algorithm>
#define IN "substr.in"
#define OUT "substr.out"
#define Lg 17000

using namespace std;

struct lol
{
    int nr[2],p;
}L[Lg];

struct cmp
{
    bool operator()(const lol &a,const lol &b)const
    {
        return a.nr[0]==b.nr[0]? a.nr[1]<b.nr[1]: a.nr[0]<b.nr[0];
    }
};

int M[17][Lg],cnt=1,stp=1,n,k;
char s[Lg];

void solve()
{
    for (int i=0;i<n;i++)
        M[0][i]=s[i]-'0';

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

int lcp(int x,int y)
{
    int rez=0;
    if (x==y)
        return n-x;
    for (int i=stp;i>=0 && x<n && y<n; i--)
    {
        if (M[i][x]== M[i][y])
        {
            x+=1<<i;
            y+=1<<i;
            rez+=1<<i;
        }
    }
    return rez;
}

void afish()
{
    int aux,Rez=0;
    for (int i=0;i+k-1<n;i++)
    {
        aux=lcp(L[i].p, L[i+k-1].p);
        if (aux>Rez)
            Rez=aux;
    }
    printf("%d\n",Rez);
}

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT,"w", stdout);

    scanf ("%d %d\n",&n,&k);
    fgets(s,Lg,stdin);

    solve();
    afish();

    return 0;
}