Cod sursa(job #418843)

Utilizator FlorianFlorian Marcu Florian Data 16 martie 2010 15:47:51
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
using namespace std;
#include<cstring>
#include<fstream>
const int MAX_N = 16384, MAX_K = 16;
int P[MAX_K][MAX_N];
int N, stp, K;
char S[MAX_N];
struct elem { int nr[2], p; };
struct cmp
{
	bool operator()(const elem &a, const elem &b)const
	{
		return a.nr[0] == b.nr[0]? (a.nr[1] < b.nr[1]): (a.nr[0]<b.nr[0]);
	}
};
elem L[MAX_N];
int lcp(int x, int y)
{
	if(x == y) return N-x;
	int ret = 0, k;
	for(k = stp; k>=0 && x< N && y < N; --k)
		if(P[k][x] == P[k][y])
			x+=1<<k, y+=1<<k, ret+=1<<k;
	return ret;
}
int ord[MAX_N], SOL;
int main()
{
	ifstream in("substr.in"); ofstream out("substr.out");
	in>>N>>K;
	in>>S;
	int i, cnt, tmp;
	for(i = 0; i < N; ++i)
		P[0][i] = S[i] - 'a';
	for(cnt = stp = 1; cnt >> 1 < N; ++stp, cnt<<=1)
	{
		for(i = 0; i < N; ++i)
		{
			L[i].nr[0] = P[stp-1][i];
			L[i].nr[1] = i+cnt<N? P[stp-1][i+cnt]:-1;
			L[i].p = i;
		}
		sort(L, L+N, cmp());
		for(i = 0; i < N; ++i)
			P[stp][ L[i].p ] = i > 0 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1]?
			P[stp][L[i-1].p]: i;
	}
	--stp;
	for(i = 0; i < N; ++i)
		ord[ P[stp][i] ] = i;
	for(i = 0; i < N - K; ++i)
	{
		tmp = lcp( ord[i], ord[i+K-1] );
		if(tmp > SOL) SOL = tmp;
	}
	out<<SOL<<"\n";
}