Cod sursa(job #545288)

Utilizator ilincaSorescu Ilinca ilinca Data 3 martie 2011 00:41:17
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define nmax 16455
#define pmax 25
#define mp make_pair
#define poz second

using namespace std;

typedef pair <pair <int, int>, int> iii;

int n, k, log2, x, y, a [pmax] [nmax];
char s [nmax];
iii v [nmax];

void suffix_arrays ()
{
	int i, j, x, y, r;
	for (j=1; j <= n; ++j)
		a [0] [j]=s [j];
	for (i=1; ; ++i)
	{
		for (j=1; j <= n; ++j)
		{
			x=a [i-1] [j];
			y=(j+(1<<(i-1)) <= n)? a [i-1] [j+(1<<(i-1))]:0;	
			v [j]=mp (mp (x, y), j);
		}	
		sort (v+1, v+1+n);
		r=1;
		a [i] [v [1].poz]=1;
		for (j=2; j <= n; ++j)
			if (v [j].first == v [j-1].first)
				a [i] [v [j].poz]=r;
			else
				a [i] [v [j].poz]=++r;
		if ((1<<i) > n) break;
	}
	log2=i;
}

inline int max (int a, int b)
{
	return (a>b)? a:b;
}

int lcp (int log2)
{
	if (log2 < 0)
		return 0;
	if (x > n || y > n)
		return 0;
	if (a [log2] [x] == a [log2] [y])
	{
		x += 1<<log2;
		y += 1<<log2;
		return (1<<log2) + lcp (log2-1);
	}
	return lcp (log2-1);
}

int rez ()
{
	int i, m=-1;
       	pair <int, int> ord [nmax];
	for (i=1; i <= n; ++i)
		ord [i]=mp (a [log2] [i], i);
	sort (ord+1, ord+1+n);	
	for (i=1; i <= n-k+1; ++i)
	{
		x=ord [i].poz;
		y=ord [i+k-1].poz;
		m=max (lcp (log2), m);
	}
	return m;
}

int main ()
{
	freopen ("substr.in", "r", stdin);
	freopen ("substr.out", "w", stdout);
	scanf ("%d%d%s", &n, &k, s+1);
	suffix_arrays ();
	printf ("%d\n", rez ());
	return 0;
}