Cod sursa(job #72685)

Utilizator gigi_becaliGigi Becali gigi_becali Data 14 iulie 2007 22:06:02
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <string>
#define maxn 140001
#define maxlg 20	

char x[maxn];
int n;

struct nod { int nr[2], p;};
nod A[maxn],b[maxn];

int P[maxlg][maxn];
char *sarray[maxn];

struct cmp{
	bool operator()(const nod &a, const nod &b)const	
	{
		if(a.nr[0]<b.nr[0]) return 1;
		if(a.nr[0]==b.nr[0] && a.nr[1]<b.nr[1]) return 1;	
		return 0;
	}
};

bool operator<(const nod &a, const nod &b)
{
	if(a.nr[0]<b.nr[0]) return 1;
		if(a.nr[0]==b.nr[0] && a.nr[1]<b.nr[1]) return 1;	
		return 0;
}
	
struct comp{
	bool operator()(const nod &a, const nod &b)const
	{
		if(a.nr[1]<b.nr[1])return 1;
		return 0;
	}
};

void read()
{
	freopen("sarray.in","r",stdin);
	gets(x);
	n=strlen(x);
}

inline void rad(int byte, int n, nod a[], nod b[])
{
	int count[1024], index[1024],i;
	memset(count, 0, sizeof(count));
	for(i=0;i<n;++i) ++count[(a[i].nr[0]>>byte)&1023];
	index[0]=0;
	for(i=1;i<1024;++i) index[i]=index[i-1]+count[i-1];
	for(i=0;i<n;++i) b[index[(a[i].nr[0]>>byte)&1023]++]=a[i];
}


inline void radix()
{
	int p=0, i;	
	//nod b[maxn];
	rad(0, n, A, b);
	rad(10, n, b, A);
	//rad(, n, A, b);
//	rad(24, n, b, A);		
//	for(i=0;i<n;++i) A[i]=b[i];	

	
	for(i=1;i<n;++i)
		if(A[i].nr[0]==A[i-1].nr[0]) ;
		else
		{
			if(i-1!=p) sort(A+p, A+i, comp());
			p=i;
		} 
	if(i-1!=p) sort(A+p, A+i, comp());


}


inline void radix2()
{
	int count[maxn],index[maxn];
	int i;
	index[0]=0;
	nod b[maxn];
	memset(count, 0,sizeof(count));
	for(i=0;i<n;++i) ++count[A[i].nr[0]];
	for(i=1;i<maxn;++i) index[i]=index[i-1]+count[i-1];
	for(i=0;i<n;++i) b[index[A[i].nr[0]]++]=A[i];
	for(i=0;i<n;++i) A[i]=b[i];

	int p=0;
	for(i=1;i<n;++i)
		if(A[i].nr[0]==A[i-1].nr[0]) ;
		else
		{
			if(i-1!=p) sort(A+p, A+i, comp());
			p=i;
		} 
	if(i-1!=p) sort(A+p, A+i, comp());
}

void sortarrays()
{
	int i, j, cnt,stp;

	for(i=0;i<n;++i) P[0][i]=x[i];

	for(cnt=1, stp=1; cnt>>1<n; cnt<<=1, ++stp)
	{
		for(i=0;i<n;++i) 
			A[i].nr[0]=P[stp-1][i],
			A[i].nr[1]=i+cnt<n?P[stp-1][i+cnt]:-1,
			A[i].p=i;
	

	sort(A, A+n,cmp());
	
	//radix2();
	//radix();
	for(i=0;i<n;++i)
		P[stp][A[i].p]=i>0 && A[i].nr[0]==A[i-1].nr[0] && A[i].nr[1]==A[i-1].nr[1] ? P[stp][A[i-1].p]:i;

	}
	
	for(i=0;i<n;++i)
		sarray[P[stp-1][i]]=x+i;
	
}		
void make_random()
{
	#include <ctime>
	srand(time(0));
	int i;
	n=100000;
	for(i=0;i<n;++i) x[i]=rand()%26+'a';
}


int main()
{
	//read();
	make_random();
	sortarrays();
//	radix();
	int ok=1;
//	for(int i=1;i<n;++i) if(strcmp(sarray[i-1], sarray[i])>0) ok=0;
	printf("%d\n", ok);	
	//	for(int i=0;i<n;++i) printf("%s\n", sarray[i]);
	return 0;
}