Cod sursa(job #756657)

Utilizator freak93Adrian Budau freak93 Data 10 iunie 2012 03:16:58
Problema Substr Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.77 kb
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const char iname[]="substr.in";
const char oname[]="substr.out";
const int maxn=18000;
const int maxl=16;

char s[maxn];

int sa[maxn],pref[maxl][maxn],i,j,n,k,maxt;
template<class T1,class T2,class T3> struct mpair
{
    T1 first;
    T2 second;
    T3 third;
    mpair() : first(T1()), second(T2()), third(T3()) {}
    mpair(const T1& x, const T2& y,const T3& z) : first(x), second(y), third(z) {}
};

template<class F1,class F2,class F3>
inline mpair<F1,F2,F3>
        make_mpair(F1 x,F2 y,F3 z)
{
    return (mpair<F1,F2,F3>(x,y,z) );
}

mpair<int,int,int> L[maxn];

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

bool fcomp(mpair<int,int,int> a,mpair<int,int,int> b)
{
    if(a.first!=b.first)
        return a.first<b.first;
    return a.second<b.second;
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    scanf("%d%d\n",&n,&k);
    fgets(s,sizeof(s),stdin);

    for(i=0;i<n;++i)
        pref[0][i]=s[i]-'0';
    for(i=1;(1<<i-1)<=n;++i)
    {
        for(j=0;j<n;++j)
        {
            L[j].first=pref[i-1][j];
            L[j].second=j+(1<<i-1)<n?pref[i-1][j+(1<<i-1)]:-1;
            L[j].third=j;
        }
        sort(L,L+n,fcomp);
        for(j=0;j<n;++j)
            pref[i][L[j].third]=(j>0&&L[j].first==L[j-1].first&&L[j].second==L[j-1].second?pref[i][L[j-1].third]:j);
    }

    for(j=n-k;j>=0;--j)
        maxt=max(maxt,lcp(L[j].third,L[j+k-1].third));

    printf("%d\n",maxt);

    fclose(stdin);
    fclose(stdout);

    return 0;
}