Cod sursa(job #689309)

Utilizator darrenRares Buhai darren Data 24 februarie 2012 12:54:18
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int SIZE = 16388;
const int LOG = 15;

struct rem
{
	int A, B, P;
} L[SIZE];

int N, K, logN;
char A[SIZE];
int P[LOG + 1][SIZE];
int maxp;

bool compare(const rem& r1, const rem& r2)
{
	if (r1.A == r2.A)
		return r1.B < r2.B;
	return r1.A < r2.A;
}
int prefix(int p1, int p2)
{
	if (p1 == p2)
		return N - p1 + 1;
	
	int result = 0;
	for (int k = logN; k >= 0 && p1 <= N && p2 <= N; --k)
		if (P[k][p1] == P[k][p2])
		{
			p1 += (1 << k);
			p2 += (1 << k);
			result += (1 << k);
		}
	return result;
}

int main()
{
	ifstream fin("substr.in");
	ofstream fout("substr.out");
	
	fin >> N >> K >> A;
	
	for (int i = 1; i <= N; ++i)
		P[0][i] = A[i - 1];
	
	int logn;
	for (logn = 1; (1 << (logn - 1)) <= N; ++logn)
	{
		for (int i = 1; i <= N; ++i)
		{
			L[i].P = i;
			L[i].A = P[logn - 1][i];
			L[i].B = (i + (1 << (logn - 1)) <= N ? P[logn - 1][i + (1 << (logn - 1))] : -1);
		}
		sort(L + 1, L + N + 1, compare);
		
		int now = 0;
		for (int i = 1; i <= N; ++i)
			if (L[i].A == L[i - 1].A && L[i].B == L[i - 1].B)
				P[logn][L[i].P] = now;
			else
				P[logn][L[i].P] = ++now;
	}
	
	logN = logn - 1;
	for (int i = 1; i <= N - K + 1; ++i)
	{
		int pre = prefix(L[i].P, L[i + K - 1].P);
		maxp = max(maxp, pre);
	}
	
	fout << maxp << '\n';
	
	fin.close();
	fout.close();
}