Cod sursa(job #866572)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 28 ianuarie 2013 12:48:20
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<cmath>
using namespace std;
int n,K,sol,lg;
char A[17000];
struct Element{int nr[2],poz;};
Element v[17000];
int Poz[15][17000],arrays[17000];

inline bool Sortare(Element A,Element B)
{
	if(A.nr[0]==B.nr[0])
		return A.nr[1]<B.nr[1];
	return A.nr[0]<B.nr[0];
}

inline int PrefixComun(int x,int y)
{
	if(x==y)
		return n-x;
	int k=lg,rez=0;
	while(k>=0 && x<n && y<n)
	{
		if(Poz[k][x]==Poz[k][y])
		{
			x+=(1<<k);
			y+=(1<<k);
			rez+=(1<<k);
		}
		k--;
	}
	return rez;
}

inline int Code(char c)
{
	if('a'<=c && c<='z')
		return c-'a';
	if('A'<=c && c<='Z')
		return c-'A'+26;
	if('0'<=c && c<='9')
		return c-'0'+52;
	return 0;
}

int main()
{
	int i,k;
	ifstream fin("substr.in");
	fin>>n>>K;
	fin>>A;
	fin.close();
	
	for(i=0;i<n;i++)
		Poz[0][i]=Code(A[i]);
	lg=0;
	while((1<<lg)<n)
		lg++;
	for(k=1;k<=lg;k++) 
	{
		for(i=0;i<n;i++)
		{
			v[i].nr[0]=Poz[k-1][i];
			if(i+(1<<(k-1))<n)
				v[i].nr[1]=Poz[k-1][i+(1<<(k-1))];
			else
				v[i].nr[1]=-1;
			v[i].poz=i;
		}
		sort(v,v+n,Sortare);
		for(i=0;i<n;i++)
		{
			if(i>0 && v[i].nr[0]==v[i-1].nr[0] && v[i].nr[1]==v[i-1].nr[1])
				Poz[k][v[i].poz]=Poz[k][v[i-1].poz];
			else
				Poz[k][v[i].poz]=i;
		}
	}
	for(i=0;i<n;i++)
		arrays[Poz[lg][i]]=i;
	for(i=0;i<=n-K;i++)
		sol=max(sol,PrefixComun(arrays[i],arrays[i+K-1]));
	
	ofstream fout("substr.out");
	fout<<sol<<"\n";
	fout.close();
	return 0;
}