Cod sursa(job #1106372)

Utilizator andrettiAndretti Naiden andretti Data 12 februarie 2014 19:14:27
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<algorithm>
#define maxn 17000
#define maxlg 16
using namespace std;

struct srt{int x,y,ind;} ord[maxn];
int n,K,sol,step;
char a[maxn];
int p[maxlg][maxn],pos[maxn];

void read()
{
    scanf("%d%d\n",&n,&K);
    scanf("%s",a+1);
}

bool cmp(const srt &a,const srt &b){
    if(a.x==b.x) return a.y<b.y;
    return a.x<b.x;
}

void suffix()
{
    int nr;
    for(int i=1;i<=n;i++) p[0][i]=a[i]-'a';
    for(step=1,nr=1;nr<n;step++,nr<<=1)
    {
        for(int i=1;i<=n;i++)
        {
            ord[i].x=p[step-1][i]; ord[i].y=-1;
            if(i+nr<=n) ord[i].y=p[step-1][i+nr];
            ord[i].ind=i;
        }
        sort(ord+1,ord+n+1,cmp);

        for(int i=1;i<=n;i++)
        {
            if(i>1 && ord[i].x==ord[i-1].x && ord[i].y==ord[i-1].y)
             p[step][ord[i].ind]=p[step][ord[i-1].ind];
            else p[step][ord[i].ind]=i;
        }
    }
    for(int i=1;i<=n;i++) pos[p[step-1][i]]=i;
}

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

void solve()
{
    for(int i=1;i+K-1<=n;i++) sol=max(sol,lcp(pos[i],pos[i+K-1]));
}

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

    read();
    suffix();
    solve();
    printf("%d",sol);

    fclose(stdin);
    fclose(stdout);
    return 0;

}