Cod sursa(job #318248)

Utilizator andrei.12Andrei Parvu andrei.12 Data 27 mai 2009 19:29:38
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

#define x first
#define y second
#define lg 17005

int n, K, i, k, j, rsp, a[20][lg], ind;
char sir[lg];
pair<pair<int, int>, int> v[lg];

int lcp(int x, int y){
	int rsp = 0;

	if (x == y)
		return n - x + 1;

	for (int i = k; i >= 0 && x <= n && y <= n; i --)
		if (a[i][x] == a[i][y])
			rsp += 1 << i, x += 1 << i, y += 1 << i;

	return rsp;
}

int main()
{
	freopen("substr.in", "rt", stdin);
	freopen("substr.out", "wt", stdout);

	scanf("%d%d\n", &n, &K);
	scanf("%s", sir+1);

	for (i = 1; i <= n; i ++)
		a[0][i] = sir[i] - '0' + 1;

	for (i = 0, k = 1; 2*i <= n; i ++, k *= 2){
		for (j = 1; j <= n; j ++){
			v[j].x.x = a[i][j];
			if (j + k <= n)
				v[j].x.y = a[i][j + k];
			else
				v[j].x.y = -1;
			v[j].y = j;
		}

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

		ind = 0;
		for (j = 1; j <= n; j ++){
			if (v[j].x.x != v[j-1].x.x || v[j].x.y != v[j-1].x.y)
				ind ++;
			a[i+1][v[j].y] = ind;
		}
	}
	k = i;

	for (i = K; i <= n; i ++)
		rsp = max(rsp, lcp(v[i].y, v[i-K+1].y));

	printf("%d\n", rsp);

	return 0;
}