Cod sursa(job #1764965)

Utilizator antanaAntonia Boca antana Data 26 septembrie 2016 09:53:55
Problema Substr Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia1-hashuri.rabinkarp Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include<string.h>
#define MAXN 32762
#define LG 14

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;
    if(x==y) return n-x+1;

    for(k=LG; k>=0; --k)
        if((1<<k)<=n)
            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)<=n;++log)
    {
        for(int i=1;i<=n;++i)
        {
            v[i].v1=p[log-1][i];
            v[i].v2=p[log-1][i+(1<<(log-1))];
            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;
}