Cod sursa(job #599178)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 28 iunie 2011 11:29:07
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>


#define MAXN 16500
#define MAXLOG 17

using namespace std;


struct lol {
	int nr[2], pos;
} L[MAXN];
int P[MAXLOG][MAXN], step;
int N, K, sol;
char s[MAXN];
inline bool cmp(const lol &a, const lol &b) {
	return a.nr[0] == b.nr[0] ? a.nr[1] < b.nr[1] : a.nr[0] < b.nr[0];
}
inline int lcp(int x, int y) {
	if(x == y) return N - x;
	
	int res = 0;
	for(int i = step; i >= 0 && x < N && y < N; i--) {
	//	printf("%d %d %d\n", i, P[i][x], P[i][y]);
		if(P[i][x] == P[i][y]) {
			int v = (1 << i);
	//		printf("%d %d %d %d %d %d\n", i, x, y, v, P[i][x], P[i][y]);
			x += v;
		       	y += v;
		       	res += v;
		}
	}
	return res;
}
int main() {

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

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

	fgets(s, MAXN, stdin);

	for(int i = 0; i < N; i++)
		P[0][i] = s[i] - 'a';
	
	int cnt;
	
	for(step = 1, cnt = 1; (cnt >> 1) < N; cnt <<= 1, step++) {
		for(int i = 0; i < N; i++) {
			//unite the bastards
			L[i].nr[0] = P[step - 1][i];
			if(i + cnt < N) L[i].nr[1] = P[step - 1][i + cnt];
			else L[i].nr[1] = -1;
		
			L[i].pos = i;
		}
		sort(L, L + N, cmp);
		
		//make sure of duplicates
		for(int i = 0; i < N; i++)
			P[step][L[i].pos] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[step][L[i - 1].pos] : i;
	}
	
	step -= 1;
#ifdef DEBUG
	printf("%d\n", step);
	for(int i = 0; i < N; i++)
		printf("%d ", L[i].pos);
	printf("\n");
	
	printf("%d\n", lcp(2, 11));
	return 0;
#endif
	for(int i = 0; i < N - K + 1; i++) {
	//	printf("%d\n", L[i].pos);
		sol = max(sol, lcp(L[i].pos, L[i + K - 1].pos));
	}
	printf("%d\n", sol);

	return 0;
}