Cod sursa(job #355086)

Utilizator raduzerRadu Zernoveanu raduzer Data 10 octombrie 2009 10:30:03
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define x first
#define y second

const int MAX_N = 17000;
const int MAX_LG = 20;

int n, pow, step, sol, k;
char s[MAX_N + 10];
pair <pair <int, int>, int> a[MAX_N];
int p[MAX_LG][MAX_N];

int lcp(int x, int y)
{
	int i, ret = 0;
	for (i = step; i && x < n && y < n; --i)
		if (p[i][x] == p[i][y])
			x += 1 << i, y += 1 << i, ret += 1 << i;

	return ret;
}

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

	scanf("%d %d", &n, &k);

	fgets(s, MAX_N, stdin);

	for (i = 0; i < n; ++i)
		p[0][i] = s[i] - 'a';

	return 0;

	for (step = 1, pow = 1; pow >> 1 < n; ++step, pow <<= 1)
	{
		for (i = 0; i < n; ++i)
		{
			a[i].x.x = p[step - 1][i];
			a[i].x.y = (i + pow < n) ? p[step - i][i + pow] : -1;
			a[i].y = i;
		}

		sort(a, a + n);

		for (i = 0; i < n; ++i)
			p[step][a[i].y] = (i > 0 && a[i].x == a[i - 1].x) ? p[step][a[i - 1].y] : i;
	}

	--step;

	for (i = 0; i <= n - k; ++i)
	{
		int val = lcp(a[i].y, a[i + k - 1].y);

		if (val > sol)
			sol = val;
	}

	printf("%d\n", sol);
}