Cod sursa(job #1837985)

Utilizator LucianTLucian Trepteanu LucianT Data 30 decembrie 2016 19:04:56
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define maxN 16500
#define maxLog 16
using namespace std;
struct nod
{
    int nr1,nr2,pos;
}l[maxN];
bool cmp(const nod &a,const nod &b)
{
    if(a.nr1==b.nr1)
        return a.nr2<b.nr2;
    return a.nr1<b.nr1;
}
char str[maxN];
int sa[maxLog][maxN]; ///suffix array
int n,i,j,len,loga,k,sol;
void build_suffixArray()
{
    int i,j;
    for(i=0;i<len;i++)
        sa[0][i]=str[i];
    for(loga=1;(1<<loga)<len;loga++)
    {
        for(j=0;j<len;j++)
        {
            l[j].pos=j;
            l[j].nr1=sa[loga-1][j];
            if(j+(1<<loga-1)<len)
                l[j].nr2=sa[loga-1][j+(1<<loga-1)];
            else l[j].nr2=-1;
        }
        sort(l,l+len,cmp);
        for(j=0;j<len;j++)
            if(j && l[j].nr1==l[j-1].nr1 && l[j].nr2==l[j-1].nr2)
                sa[loga][l[j].pos]=sa[loga][l[j-1].pos];
            else sa[loga][l[j].pos]=j;
    }
    --loga;
}
int lcp(int x,int y)
{
    int p,res=0;
    if(x==y)
        return len-x;
    for(p=loga-1;p>=0 && x<len && y<len;p--)
        if(sa[p][x]==sa[p][y])
            res+=(1<<p),x+=(1<<p),y+=(1<<p);
    return res;
}
int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d %d\n",&len,&k);
    gets(str);
    build_suffixArray();
    for(i=0;i<len-k;i++)
        sol=max(sol,lcp(l[i].pos,l[i+k-1].pos));
    printf("%d",sol);
    return 0;
}