Cod sursa(job #1300404)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 24 decembrie 2014 13:44:38
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 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;
    }
};
el v[Nmax];

int n,k,dp[Nmax][20];
char a[Nmax];

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

inline void SuffixArrays()
{
    int i,j;
    for(i=1;i<=n;++i)
        dp[i][0]=a[i]-'A';
    for(j=1;(1<<(j-1))<n;++j)
    {
        for(i=1;i<=n;++i)
        {
            v[i].poz=i;
            v[i].v1=dp[i][j-1];
            if(i+(1<<(j-1))>n) v[i].v2=-1;
            else v[i].v2=dp[i+(1<<(j-1))][j-1];
        }
        sort(v+1,v+n+1);
        dp[v[1].poz][j]=0;
        for(i=2;i<=n;++i)
            if(v[i].v1==v[i-1].v1 && v[i].v2==v[i-1].v2) dp[v[i].poz][j]=dp[v[i-1].poz][j];
            else dp[v[i].poz][j]=dp[v[i-1].poz][j]+1;
    }
}

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