Cod sursa(job #1767716)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 29 septembrie 2016 17:15:49
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 16500

using namespace std;

char s[MAXN];
int p[30][MAXN], lg, n, k;
int mp[MAXN];
struct elem
{
    int ind, x, y;
    elem(int ind = 0, int x = 0, int y = 0) : ind(ind), x(x), y(y) { }
    bool operator()(elem e, elem f)
    {
        if (e.x != f.x) return e.x < f.x;
        return e.y < f.y;
    }
}e[MAXN];

void prepare()
{
	for (int i = 0; i < n; i++)
        p[0][i] = s[i] - 'a';
    for (int i = 1, crt = 1; (crt>>1) < n; i++, crt <<= 1) {
        for (int j = 0; j < n; j++) {
            e[j].ind = j;
            e[j].x = p[i-1][j];
            if (j + crt < n) e[j].y = p[i-1][j+crt];
            else e[j].y = -1;
        }
        sort(e, e+n, elem());
        p[i][e[0].ind] = 0;
        for (int j = 1; j < n; j++) {
            if (e[j].x != e[j-1].x || e[j].y != e[j-1].y)
				p[i][e[j].ind] = p[i][e[j-1].ind]+1;
            else
				p[i][e[j].ind] = p[i][e[j-1].ind];
        }
        lg = i;
    }
    for (int i = 0; i < n; i++)
		mp[p[lg][i]] = i;
}

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

void solve()
{
	int maxi = 0;
    for (int i = 0; i+k-1 < n; i++) {
        int c = lcp(mp[i], mp[i+k-1]);
		maxi = max(maxi, c);
    }
    printf("%d", maxi);
}

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

    scanf("%d %d\n", &n, &k);
	gets(s);
	prepare();
	solve();

    return 0;
}