Cod sursa(job #1746156)

Utilizator antanaAntonia Boca antana Data 22 august 2016 18:28:42
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <algorithm>
#include<string.h>
#define MAXN 32762
#define LG 17

struct aa{
    int v1,v2,pos;
}v[MAXN+1];

int n, p[LG+1][MAXN+1], l;
char s[MAXN+2];

bool cmp(const aa &a, const aa &b)
{
    if(a.v1==b.v1)
    {
        if(a.v2==b.v2)
            return (a.pos < b.pos);
        return (a.v2<b.v2);
    }
    return (a.v1<b.v1);
}

inline int lcp(int x, int y)
{
    int k, ans=0;
    for(k=l; k>=0 && x <= n && y <= n; --k)
        if(p[k][x] == p[k][y])
            x+=(1<<k), y+=(1<<k), ans+=(1<<k);
    return ans;
}

inline int maxim(int a, int b)
{
    if(a>b)
        return a;
    return b;
}

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

    int k, ans=0;

    scanf("%d%d\n", &n, &k);
    gets(s+1);

    for(int i=1;i<=n;++i)
        p[0][i]=s[i];

    for(int log=1;(1<<log) < 2*n;++log)
    {
        for(int i=1;i<=n;++i)
        {
            v[i].v1=p[log-1][i];
            if(i+(1<<(log-1)) <= n)
                v[i].v2=p[log-1][i+(1<<(log-1))];
            else v[i].v2=MAXN;
            v[i].pos=i;
        }

        std::sort(v+1, v+n+1, cmp);

        for(int i=1;i<=n;++i)
            if(v[i].v1 == v[i-1].v1 && v[i].v2 == v[i-1].v2)
                p[log][v[i].pos]=p[log][v[i-1].pos];
            else p[log][v[i].pos]=i;
        l=log;
    }

    for(int i=1;i<=n-k+1;++i)
        ans=maxim(ans, lcp(v[i].pos, v[i+k-1].pos));

    printf("%d", ans);

    return 0;
}