Cod sursa(job #512809)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 14 decembrie 2010 17:13:51
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define maxim(a,b) (a>b ? a : b)
#define pii pair< pair<int,int>, int>
#define x first.first
#define y first.second
#define z second

int sol,suff[17005];
int A[17][17005],n,k,h;
char fol[305],s[17005];
pii v[17005];

int prefix(int px,int py)
{
    int k,p=0;
    for(k=h; k>=0; k--)
        if (px<=n && py<=n && A[k][px]==A[k][py])
            px+=(1<<k), py+=(1<<k), p+=(1<<k);
    return p;
}

int main ()
{
    int i,l,g,p;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d\n",&n,&k);
    s[0]=' ';
    fgets(s+1,sizeof(s),stdin);
    for(i=1;i<=n;i++)
        fol[(int)s[i]]=1;
    for(i=1;i<256;i++)
        fol[i]+=fol[i-1];
    for(i=1;i<=n;i++)
        A[0][i]=fol[(int)s[i]-1]+1;
        
    for(l=2,h=1;l<=n;l*=2,h++)
    {
        for(i=1;i<=n;i++)
        {
            v[i].x=A[h-1][i];
            if (i+l/2 <= n)
                v[i].y=A[h-1][i+l/2];
            else
                v[i].y=0;
            v[i].z=i;
        }
        sort(v+1,v+n+1);

        g=1;
        for(i=1;i<=n;i++)
        {
            if(i>1 && (v[i].x!=v[i-1].x || v[i].y!=v[i-1].y))
                g++;
            A[h][v[i].z]=g;
        }
    }
    h--;
    for(i=1;i<=n;i++)
        suff[A[h][i]]=i;

    for(i=1;i<=n-k+1;i++)
    {
        p=prefix(suff[i],suff[i+k-1]);
        sol=maxim(sol,p);
    }
    printf("%d\n",sol);
        
    return 0;
}