Cod sursa(job #635146)

Utilizator ChallengeMurtaza Alexandru Challenge Data 18 noiembrie 2011 15:58:47
Problema Substr Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <algorithm>

using namespace std;

const char InFile[]="substr.in";
const char OutFile[]="substr.out";
const int MaxN=16385;
const int LogMaxN=17;

ifstream fin(InFile);
ofstream fout(OutFile);

struct Suffix
{
	int pos,ms,ls;
};

struct Suffix_cmp
{
	inline bool operator() (const Suffix &a, const Suffix &b)
	{
		if(a.ms!=b.ms)
		{
			return a.ms<b.ms;
		}
		return a.ls<b.ls;
	}
};

int N,K,sol,P[LogMaxN][MaxN],logN;
char S[MaxN];
Suffix L[MaxN];

inline void SuffixArray()
{
	for(register int i=0;i<N;++i)
	{
		P[0][i]=(int)(S[i]);
	}
	
	int stp,cnt;
	for(stp=1,cnt=1;cnt<N;++stp,cnt<<=1)
	{
		for(register int i=0;i<N;++i)
		{
			L[i].ms=P[stp-1][i];
			L[i].ls=i+cnt<N?P[stp-1][i+cnt]:-1;
			L[i].pos=i;
		}
		sort(L,L+N,Suffix_cmp());
		for(register int i=0;i<N;++i)
		{
			P[stp][L[i].pos]= i>0 && L[i].ms==L[i-1].ms && L[i].ls==L[i-1].ls?P[stp][L[i-1].pos]:i;
		}
	}
	logN=stp-1;
}

inline int LCP(int x, int y)
{
	if(x==y)
	{
		return N-x;
	}
	int sol=0,stp=logN;
	for(;stp>=0;--stp)
	{
		if(P[stp][x]==P[stp][y])
		{
			x+=1<<stp;
			y+=1<<stp;
			sol+=1<<stp;
		}
	}
	return sol;
}

int main()
{
	fin>>N>>K>>S;
	fin.close();
	
	SuffixArray();
	
	--K;
	for(register int i=0;i+K<N;++i)
	{
		sol=max(sol,LCP(L[i].pos,L[i+K].pos));
	}
	
	fout<<sol;
	fout.close();
	return 0;
}