Cod sursa(job #1879556)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 14 februarie 2017 23:35:10
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct suffix
{
    int poz,s1,s2;
    bool operator <(const suffix &aux) const
    {
        if(s1==aux.s1) return s2<aux.s2;
        else return s1<aux.s1;
    }
    bool operator ==(const suffix &aux) const
    {
        return (s1==aux.s1 && s2==aux.s2);
    }
};

suffix v[17000];
int n,p[17][17000],logn;
char sir[17000];

int LCP(int a,int b)
{
    int l=0;
    for(int i=logn;i>=0;i--)
        if(a+(1<<i)<=n+1 && b+(1<<i)<=n+1 && p[i][a]==p[i][b])
        {
            a+=1<<i;
            b+=1<<i;
            l+=1<<i;
        }
    return l;
}

int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    int k,sol=0;
    scanf("%d%d\n",&n,&k);
    gets(sir+1);
    for(logn=1;(1<<logn)<=n;logn++)
    for(int i=1;i<=n;i++)
    {
        v[i].poz=i;
        p[0][i]=sir[i];
    }
    for(int bit=1;bit<=logn;bit++)
    {
        for(int i=1;i<=n;i++)
        {
            v[i].s1=p[bit-1][v[i].poz];
            if(v[i].poz+(1<<(bit-1))<=n) v[i].s2=p[bit-1][v[i].poz+(1<<(bit-1))];
            else v[i].s2=-1;
        }
        sort(v+1,v+n+1);
        for(int i=2;i<=n;i++)
            if(v[i]==v[i-1]) p[bit][v[i].poz]=p[bit][v[i-1].poz];
            else p[bit][v[i].poz]=i;
    }
    for(int i=1;i<=n-k+1;i++) sol=max(sol,LCP(v[i].poz,v[i+k-1].poz));
    printf("%d",sol);
    return 0;
}