Cod sursa(job #1227844)

Utilizator touristGennady Korotkevich tourist Data 11 septembrie 2014 22:36:26
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <algorithm>
#define Nmax 17000

using namespace std;

int N,K,dp[20][Nmax];
char a[Nmax];

struct el
{
    int val1,val2,poz;
    bool operator < (const el &A) const
    {
        if(val1==A.val1) return val2<A.val2;
        return val1<A.val1;
    }
};
el L[Nmax];
int len;

inline void Suffix_Arrays()
{
    int i,j;
    el w;
    for(i=1;i<=N;++i)
        dp[0][i]=a[i]-'0';
    for(i=1;1<<(i-1)<N;++i)
    {
        len=0;
        for(j=1;j<=N;++j)
        {
            w.val1=dp[i-1][j];
            if(j+(1<<(i-1))>N) w.val2=-1;
            else w.val2=dp[i-1][j+(1<<(i-1))];
            w.poz=j;
            L[++len]=w;
        }
        sort(L+1,L+len+1);
        dp[i][L[1].poz]=0;
        for(j=2;j<=len;++j)
            if(L[j].val1==L[j-1].val1 && L[j].val2==L[j-1].val2)
                dp[i][L[j].poz]=dp[i][L[j-1].poz];
            else
                dp[i][L[j].poz]=dp[i][L[j-1].poz]+1;
    }
}

inline int LCP(int p1, int p2)
{
    int i=p1,j=p2,k;
    for(k=0;p1+(1<<k)-1<=N && p2+(1<<k)-1<=N;++k);
    --k;
    for(;k>=0 && i<=N && j<=N;--k)
        if(dp[k][i]==dp[k][j])
        {
            i+=(1<<k); j+=(1<<k);
        }
    return i-p1;
}

int main()
{
    int i,sol=0;
    freopen ("substr.in","r",stdin);
    freopen ("substr.out","w",stdout);
    scanf("%d%d%s", &N,&K,(a+1));
    Suffix_Arrays();
    for(i=1;i+K-1<=N;++i) sol=max(sol,LCP(L[i].poz,L[i+K-1].poz));
    printf("%d\n", sol);
    return 0;
}