Cod sursa(job #420534)

Utilizator DraStiKDragos Oprica DraStiK Data 19 martie 2010 20:55:16
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <algorithm>
using namespace std;

#define DIM 16390
#define LOG 15

struct suffix {int l1,l2,i;} v[DIM];
int p[LOG][DIM];
char buff[DIM];
int n,m,k,sol;
int ord[DIM];

struct cmp
{
    bool operator () (const suffix &a,const suffix &b) const
    {
        return a.l1<b.l1 || (a.l1==b.l1 && a.l2<b.l2);
    }
};

inline int lcp (int x,int y)
{
    int i,nrt;

    if (x==y)
        return n-x;
    for (nrt=0, i=m; i>=0 && x<n && y<n; --i)
        if (p[i][x]==p[i][y])
        {
            x+=(1<<i);
            y+=(1<<i);
            nrt+=(1<<i);
        }
    return nrt;
}

void solve ()
{
    int i,j;

    for (i=0; i<n; ++i)
        p[0][i]=buff[i]-'a';
    for (i=m=1; (i>>1)<n; ++m, i<<=1)
	{
		for (j=0; j<n; ++j)
		{
			v[j].l1=p[m-1][j];
			if (i+j<n)
                v[j].l2=p[m-1][i+j];
            else
                v[j].l2=-1;
			v[j].i=j;
		}
		sort (v,v+n,cmp ());
		for (j=0; j<n; ++j)
            if (j>0 && v[j].l1==v[j-1].l1 && v[j].l2==v[j-1].l2)
                p[m][v[j].i]=p[m][v[j-1].i];
            else
                p[m][v[j].i]=j;
	}
	--m;
    for (i=0; i<n; ++i)
        ord[p[m][i]]=i;
    for (i=0; i<n-k; ++i)
        sol=max (sol,lcp (ord[i],ord[i+k-1]));
    printf ("%d",sol);
}

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

    scanf ("%d%d\n",&n,&k);
    fgets (buff,DIM,stdin);
    solve ();

    return 0;
}