Cod sursa(job #1159465)

Utilizator andreiiiiPopa Andrei andreiiii Data 29 martie 2014 17:10:15
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <algorithm>
#include <fstream>
#include <cstring>

using namespace std;

const int N=17000, LG=15;

ifstream fin("substr.in");
ofstream fout("substr.out");

struct entry{
    int nr1, nr2, poz;
    bool operator<(const entry &e) const
    {
        if(nr1==e.nr1) return nr2<e.nr2;
        return nr1<e.nr1;
    }
    bool operator!=(const entry &e) const
    {
        return (nr1!=e.nr1||nr2!=e.nr2);
    }
} L[N];

char a[N];
int P[LG][N];
int n, step;

void Sa_build(char a[], const int n)
{
    int i, k;
    for(i=0;i<n;i++) P[0][i]=a[i]-'a';
    for(step=1, k=1;k>>1<n;step++, k<<=1)
    {
        for(i=0;i<n;i++)
        {
            L[i].nr1=P[step-1][i];
            L[i].nr2=i+k<n?P[step-1][i+k]:-1;
            L[i].poz=i;
        }
        sort(L, L+n);
        for(i=0;i<n;i++)
        {
            if(!i||L[i]!=L[i-1]) P[step][L[i].poz]=i;
            else P[step][L[i].poz]=P[step][L[i-1].poz];
        }
    }
    step--;
}

int lcp(int x, int y)
{
    if(x==y) return n-x;
    int k, ret=0;
    for(k=step;k>=0&&x<n&&y<n;k--)
    {
        if(P[k][x]==P[k][y])
        {
            x+=(1<<k);
            y+=(1<<k);
            ret+=(1<<k);
        }
    }
    return ret;
}

int main()
{
    int k, i, sol=0;
    fin>>n>>k>>a;
    Sa_build(a, n);
    for(i=0;i+k<=n;i++) sol=max(sol, lcp(L[i].poz, L[i+k-1].poz));
    fout<<sol<<"\n";
    fin.close();
    fout.close();
}