Cod sursa(job #886459)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 22 februarie 2013 21:15:42
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <algorithm>
#define NM 17000
#define LG 17
#define val1 first.first
#define val2 first.second
#define pos second

using namespace std;

ifstream f("substr.in");
ofstream g("substr.out");

typedef pair< pair<int, int>, int> PI;

PI Norm[NM];
int N, K, M;
int i, j;
int SortOrder[LG][NM];
string S;
int length, step;
int ANS;
pair<int, int> SuffixArray[NM];

int LCP (int x, int y)
{
    if (x==y) return N-x;
    int ANS=0;

    for (int step=M-1; step>=0 && x<=N && y<=N; --step)
        if (SortOrder[step][x]==SortOrder[step][y])
        {
            x+=1 << step;
            y+=1 << step;
            ANS+=min(1 << step, N);
        }

    return ANS;
}

int Convert (char X)
{
    if (X<='9') return X-'0';
    if (X<='Z') return X-'A'+10;
    if (X<='z') return X-'a'+36;
}

int main ()
{
    f >> N >> K;
    getline(f, S);
    getline(f, S);
    S=' '+S;

    for (i=1; i<=N; i++)
        SortOrder[0][i]=Convert(S[i]);

    for (step=1, length=1; length >> 1 <=N; ++step, length<<=1)
    {
        M=step;
        for (i=1; i<=N; i++)
        {
            Norm[i].val1=SortOrder[step-1][i];
            Norm[i].val2=(i+length<=N? SortOrder[step-1][i+length] : -1);
            Norm[i].pos=i;
        }

        Norm[0].val1=-1;
        sort(Norm+1, Norm+N+1);

        for (i=1, j=0; i<=N; i++)
        {
            if (Norm[i].val1!=Norm[i-1].val1 || Norm[i].val2!=Norm[i-1].val2)
                ++j;

            SortOrder[step][Norm[i].pos]=j;
        }
    }

    for (i=1; i<=N; i++)
    {
        SuffixArray[i].first=SortOrder[M][i];
        SuffixArray[i].second=i;
    }

    sort(SuffixArray+1, SuffixArray+N+1);

    for (i=1; i<=N-K+1; i++)
        ANS=max(ANS, LCP(SuffixArray[i].second, SuffixArray[i+K-1].second) );

    g << min(ANS, N) << '\n';

    f.close();
    g.close();

    return 0;
}