Cod sursa(job #778442)

Utilizator tm_raduToma Radu tm_radu Data 14 august 2012 19:44:16
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMAX 17000

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

int n, k, step, cnt, i, v, result;
char s[NMAX];
int p[50][NMAX], ord[NMAX];

void Build();
int Prefix(int a, int b);
bool cmp(const entry &a, const entry &b) {
	return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1]) : (a.nr[0] < b.nr[0]);
}

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

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

	Build();

	result = Prefix(0, k-1);
	for (i = 1; i < n-k; ++i)
	{
		v = Prefix(i, i+k-1);
		if (v > result) result = v;
	}
	printf("%d\n", result);

	return 0;
}

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

	for (step = 1, cnt = 1; cnt >> 1 < n; ++step, cnt <<= 1) 
	{
		for (i = 0; i < n; ++i) 
		{
			L[i].nr[0] = p[step - 1][i];
			L[i].nr[1] = i + cnt < n ? p[step - 1][i + cnt] : -1;
			L[i].p = i;
		}
		std::sort(L, L + n, cmp);
		
		for (i = 0; i < n; ++i)
			p[step][L[i].p] = 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].p] : i;
	}

	for (i = 0; i < n; ++i) 
		ord[p[step-1][i]] = i;
}

int Prefix(int a, int b)
{
	int res = 0;
	while (ord[a] + res < n && ord[b] + res < n && s[ord[a]+res] == s[ord[b]+res])
		res++;
	return res;
}