Cod sursa(job #1067399)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 26 decembrie 2013 19:41:03
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.3 kb
#include<algorithm>
#include<vector>
#include<utility>
#include<cstdio>

using namespace std;

const int NMAX = 2*16385;

char S[NMAX];
int N,K,logN,sol;
int P[16][NMAX];
int V[NMAX];
pair<pair<int,int>,int> L[NMAX];

void suffix_arrays()
{
    int i,j,k;
    for(i=1; i<=N; i++) P[0][i]=S[i]-'a'+1;
    for(i=j=1; j<=N; i++, j<<=1)
    {
        for(k=1; k<=N; k++)
            L[k]=make_pair(make_pair(P[i-1][k],P[i-1][k+j]),k);
        sort(L+1,L+N+1);
        for(k=1; k<=N; k++)
        {
            if(k>1 && L[k].first.first == L[k-1].first.first && L[k].first.second == L[k-1].first.second) P[i][L[k].second]=P[i][L[k-1].second];
            else P[i][L[k].second]=k;
        }
    }
    logN=i-1;
    for(i=1; i<=N; i++) V[P[logN][i]]=i;
}

int LCP(int X,int Y)
{
    int i,rtn=0;
    if(X==Y) return N-X+1;
    for(i=logN; i>=0 && X<=N && Y<=N; i--)
        if(P[i][X]==P[i][Y])
        {
            X+=(1<<i);
            Y+=(1<<i);
            rtn+=(1<<i);
        }
    return rtn;
}

int main()
{
    int i;
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d",&N,&K);
    scanf("%s",S+1);
    suffix_arrays();
    for(i=1; i<=N-K+1; i++)
        sol=max(sol,LCP(V[i],V[i+K-1]));
    printf("%d\n",sol);
    return 0;
}