Cod sursa(job #2346573)

Utilizator AndreiSorin26012001Cirpici Andrei Sorin AndreiSorin26012001 Data 17 februarie 2019 20:24:18
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <bits/stdc++.h>
#define DIM_node 105
#define DIM_edges 1
#define DIM 16390
#define INF 2*DIM
#define v1 first.first
#define v2 first.second
#define position second
using namespace std;

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

pair< pair<int, int>, int > L[DIM];
int n, k, Exponent;
int A[17][DIM], arr[DIM];

int lcp( int a, int b )
{
    int exponent = Exponent;
    int power = (1<<exponent);
    int solution = 0;

    while( power )
    {
        if( A[exponent][a] == A[exponent][b] )
            solution += power, a += power, b += power;

        power /= 2;
        exponent--;
    }

    return solution;
}


int main()
{

    in>>n>>k;

    if( k == 1 )
    {
        out<<n;
        return 0;
    }

    for( int i = 0; i < n; i++ )
    {
        char ch;
        in>>ch;

        A[0][i] = ch - '0';
    }

    for( int exponent = 0; (1<<exponent) <= n; exponent++ )
    {
        int power = (1<<exponent);
        Exponent = exponent;

        for( int i = 0; i < n; i++ )
        {
            L[i].v1 = A[exponent][i];
            L[i].v2 = ( i + power < n ) ? A[exponent][i + power] : -1;
            L[i].position = i;
        }

        sort( L, L + n );

        A[exponent + 1][ L[0].position ] = 0;
        for( int i = 1; i < n; i++ )
            if( L[i].first == L[i - 1].first )
                A[exponent + 1][ L[i].position ] = A[exponent + 1][ L[i - 1].position ];
            else
                A[exponent + 1][ L[i].position ] = A[exponent + 1][ L[i - 1].position ] + 1;

    }

    for( int i = 0; i < n; i++ )
        arr[ A[Exponent][i] ] = i;

    int solution = 0;
    for( int i = 0; i + k - 1 < k; i++ )
        solution = max( solution, lcp( arr[i], arr[i + k -1] ) );

    out<<solution;

    return 0;
}