Cod sursa(job #1689317)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 14 aprilie 2016 09:51:21
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>

#define F first
#define S second

using namespace std;

const int maxlog = 14;
const int nmax = (1 << 14) + 10;

int p[maxlog+1][nmax];
pair < pair < int , int > , int > v[nmax];

int n , k;
char s[nmax];

void bagaSA()
{
    int i , j;

    for (i = 1; i <= n; ++i) p[0][i] = s[i] - 'a';
    for (i = 1; (1 << i) <= n; ++i)
    {
        for (j = 1; j <= n; ++j)
        {
            v[j].F = {p[i-1][j] , p[i-1][j+(1<<(i-1))]};
            v[j].S = j;
        }

        sort(v + 1 , v + n + 1);

        for (j = 1; j <= n; ++j)
            p[i][v[j].S] = p[i][v[j-1].S] + (v[j].F != v[j-1].F);
    }
}

int lcp(int a , int b)
{
    if (a == b) return n - a;

    int ret = 0;

    for (int i = maxlog; i >= 0; --i)
        if ((1 << i) <= n && p[i][a] == p[i][b])
            a += (1 << i), b += (1 << i), ret += (1 << i);

    return ret;
}

int solve()
{
    int ret = 0;
    for (int i = 1; i <= n - k + 1; ++i)
        ret = max(ret , lcp(v[i].S , v[i+k-1].S));

    return ret;
}

int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);

    scanf("%d %d\n", &n, &k);
    gets(s+1);

    bagaSA();
    printf("%d\n", solve());

    return 0;
}