Cod sursa(job #96021)

Utilizator sealTudose Vlad seal Data 30 octombrie 2007 23:38:55
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
using namespace std;
#include<cstdio>
#include<algorithm>
#include<utility>
#define Nm (1<<15)
#define Lognm 16
char S[Nm];
int P[Lognm][Nm],n,k;
struct entry
{
    int p;
    pair<int,int> nr;
} L[Nm];

void read()
{
    freopen("substr.in","r",stdin);
    scanf("%d%d ",&n,&k);
    gets(S);
}

bool cmp(entry a, entry b)
{
    return a.nr<b.nr;
}

int solve()
{
    int A[Nm],stp,cnt,i,l;

    if(k==1)
        return n;

    for(i=0;i<n;++i)
        P[0][i]=S[i];
    for(stp=1,cnt=1;cnt<n;++stp,cnt<<=1)
    {
        for(i=0;i<n;++i)
        {
            L[i].p=i;
            L[i].nr=make_pair(P[stp-1][i],i+cnt<n?P[stp-1][i+cnt]:-1);
        }
        sort(L,L+n,cmp);
        P[stp][L[0].p]=0;
        for(i=1;i<n;++i)
            P[stp][L[i].p]=L[i].nr==L[i-1].nr?P[stp][L[i-1].p]:i;
    }

    for(l=i=0;i<n;++i)
        A[i]=-1;
    for(--stp;stp>=0;--stp)
    {
        for(i=0;i<n;++i)
        {
            L[i].p=i;
            L[i].nr=make_pair(A[i],i+l<n?P[stp][i+l]:-1);
        }
        sort(L,L+n,cmp);
        for(cnt=i=1;i<n;++i)
            if(L[i].nr==L[i-1].nr)
                ++cnt;
            else
            {
                if(cnt>=k)
                    break;
                cnt=1;
            }
        if(cnt>=k)
        {
            A[L[0].p]=0;
            for(i=1;i<n;++i)
                A[L[i].p]=L[i].nr==L[i-1].nr?A[L[i-1].p]:i;
            l|=1<<stp;
        }
    }
    return l;
}

void write(int ans)
{
    freopen("substr.out","w",stdout);
    printf("%d\n",ans);
}

int main()
{
    read();
    write(solve());
    return 0;
}