Cod sursa(job #426059)

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

using namespace std;


struct lol
{
    int a,b,p;
}L[Lg];

struct cmp
{
    bool operator()(const lol &i, const lol &j)const
    {
        return i.a==j.a? i.b<j.b: i.a<j.a;
    }
};

int D[U][Lg];
int n, k, Max, stp, cnt, Rez;
char s[Lg];

void suffix()
{
    for (int i=0;i<n;i++)
        D[0][i]=s[i]-'a';

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

int lcp(int p1,int p2)
{
    int rez=0,i;
    if (p1==p2)
        return n-p1;
    for (i=Max;i>=0 && p1<n && p2<n;i--)
    {
        if (D[i][p1] == D[i][p2])
        {
            p1+=1<<i;
            p2+=1<<i;
            rez+=1<<i;
        }
    }
    return rez;
}

void solve()
{
    int aux;
    for (int i=0;i<n-k;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);
    suffix();
    solve();
    return 0;
}