Cod sursa(job #1414421)

Utilizator loturiLoturi super ruperi loturi Data 2 aprilie 2015 16:40:25
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>
#define Nmax 17000

using namespace std;

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

char sir[Nmax];
int n,dp[Nmax][20];

inline void SuffArrays()
{
    int i,len,j;
    for(i=1;i<=n;++i) dp[i][0]=sir[i]-'0';
    for(i=1;(1<<(i-1))<=n;++i)
    {
        len=0;
        for(j=1;j<=n;++j)
        {
            el w;
            w.poz=j; w.v1=dp[j][i-1];
            if(j+(1<<(i-1))>n) w.v2=-1;
            else w.v2=dp[j+(1<<(i-1))][i-1];
            L[++len]=w;
        }
        sort(L+1,L+len+1);
        dp[L[1].poz][i]=0;
        for(j=2;j<=n;++j)
        {
            dp[L[j].poz][i]=dp[L[j-1].poz][i];
            if(!(L[j]==L[j-1])) ++dp[L[j].poz][i];
        }
    }
}

inline int LCP(int p1, int p2)
{
    int i,sol=0;
    for(i=20;i>=0;--i)
    {
        if(p1+(1<<i)-1>n || p2+(1<<i)-1>n) continue;
        if(dp[p1][i]==dp[p2][i])
        {
            p1+=(1<<i); p2+=(1<<i); sol+=(1<<i);
        }
    }
    return sol;
}

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