Cod sursa(job #1467597)

Utilizator theprdvtheprdv theprdv Data 3 august 2015 18:47:50
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <algorithm>
#define MAXN 1 << 15
#define LG 15
#define max(x, y) (x) > (y) ? (x) : (y)

using namespace std;

int K, N;
char A[MAXN];
int P[LG][MAXN], maxx, step, IP[MAXN];

struct entry{
	int nr[2], p;
} L[MAXN];

inline bool cmp(const entry a, const entry b){
	return a.nr[0] != b.nr[0] ? a.nr[0] < b.nr[0] : a.nr[1] < b.nr[1];
}

inline int LCP(int x, int y){
	if (x == y) return 0;
	int k = step, ret = 0;

	for (; k >= 0 && x < N && y < N; --k)
		if (P[k][x] == P[k][y]) x += 1 << k, y += 1 << k, ret += 1 << k;

	return ret;
}

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

	scanf("%d %d\n", &N, &K);
	gets(A);

	for (int i = 0; i < N; ++i) P[0][i] = A[i] - 'a';

	if (K == 1){
		printf("%d\n", N);
		return 0;
	}

	for (i = 1; 1 << (i - 1) < N; ++i){
		for (int j = 0; j < N; ++j)
			L[j].nr[0] = P[i - 1][j],
			L[j].nr[1] = j + (1 << (i - 1)) <= N ? P[i - 1][j + (1 << (i - 1))] : -1,
			L[j].p = j;

		sort(L, L + N, cmp);
		for (int j = 0; j < N; ++j)
			P[i][L[j].p] = j && L[j].nr[0] == L[j - 1].nr[0] && L[j].nr[1] == L[j - 1].nr[1] ? P[i][L[j - 1].p] : j;
	}
	step = i - 1;
	for (i = 0; i < N; ++i) IP[P[step][i]] = i;

	for (i = 0; i < N - K; ++i)
		maxx = max(maxx, LCP(IP[i], IP[i + K - 1]));

	printf("%d\n", maxx);
	return 0;
}