Cod sursa(job #757798)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 13 iunie 2012 15:17:53
Problema Substr Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.44 kb
#include <fstream>
#include <iostream>
#include <cassert>
#include <algorithm>
using namespace std;

const int NMAX = 16384;
const int LOGMAX = 15;

int N, K, logN, p[LOGMAX][NMAX], sortedPref[NMAX];
pair< pair<int, int>, int > v[NMAX];
string s;

int norm(char c)
{
	if (c >= 'a' && c <= 'z')
		return c -'a';
	if (c >= 'A' && c <= 'Z')
		return c-'A' + 26;
	if (c >= '0' && c <= '9')
		return c - '0' + 52;
	assert(false);
	return -1;
}

int lcs(int x, int y)
{
	int lim = min(N-x, N-y);
	int ret = 0;
	for (int k = logN; k >= 0; --k)
		if (p[k][x] == p[k][y])
		{
			ret += 1<<k;
			x += 1<<k;
			y += 1<<k;
		}
	ret = min(ret, lim);
	return ret;
}

int main()
{
	ifstream fin("substr.in");
	fin>>N>>K;
	fin>>s;
	
	//Build suffix array
	for (int i = 0; i < N; ++i)
		p[0][i] = norm(s[i]);
	logN = 0;
	while ((1<<logN) < N) ++logN;
	for (int k = 1; k <= logN; ++k)
	{
		for (int i = 0; i < N; ++i)
			v[i] = make_pair(make_pair(p[k-1][i], i+(1<<(k-1)) < N ? p[k-1][i+(1<<(k-1))] : -1), i);
		sort(v, v+N);
		int index = 0;
		p[k][v[0].second] = index;
		for (int i = 1; i < N; ++i)
		{
			if (v[i].first > v[i-1].first) ++index;
			p[k][v[i].second] = index;
		}
	}

	for (int i = 0; i < N; ++i)
		sortedPref[p[logN][i]] = i;

	int ans = 0;
	for (int i = 0; i + K - 1 < N; ++i)
		ans = max(ans, lcs(sortedPref[i], sortedPref[i+K-1]));
	
	ofstream fout("substr.out");
	fout<<ans<<"\n";

	return 0;
}