Cod sursa(job #1552240)

Utilizator tudi98Cozma Tudor tudi98 Data 17 decembrie 2015 16:07:43
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
#define Nmax 16384

struct entry
{
    int nr[2];
    int p;
};

entry L[Nmax+6];
int P[17][Nmax+6],n,k,step;
char A[Nmax+6];

bool comp(const entry& a,const entry& b)
{
    if (a.nr[0] == b.nr[0]) return a.nr[1] < b.nr[1];
    return a.nr[0] < b.nr[0];
}

void BuildSuffixArray()
{
    for (int i = 1; i <= n; i++)
    {
        if (A[i] >= '0' && A[i] <= '9') P[0][i] = A[i] - '0';
        else if (A[i] >= 'A' && A[i] <= 'B') P[0][i] = 10 + A[i] - 'A';
        else P[0][i] = 36 + A[i] - 'a';
    }

    for (step = 1; 1<<step-1 <= n; ++step)
    {
        for (int i = 1; i <= n; i++)
        {
            L[i].nr[0] = P[step-1][i];
            L[i].nr[1] = (1<<step-1)+i <= n ? P[step-1][(1<<step-1)+i] : -1;
            L[i].p = i;
        }
        sort(L+1,L+n+1,comp);
        for (int i = 1; i <= n; i++)
        {
            if (i > 1 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1])
                P[step][L[i].p] = P[step][L[i-1].p];
            else
                P[step][L[i].p] = i;
        }
    }
}

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

int main()
{
    ifstream fin("substr.in");
    ofstream fout("substr.out");

    fin >> n >> k;
    fin >> (A+1);

    BuildSuffixArray();

    int Sol = 0;
    for (int i = k; i <= n; i++)
        Sol = max (Sol, lcp(L[i].p,L[i-k+1].p));

    fout << Sol;
}