Cod sursa(job #479291)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 23 august 2010 16:17:17
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
#define N_MAX 100002
char *a[N_MAX];
char c[N_MAX];
int n,i,j,t,k;
int N,nf;
int ind[N_MAX],lg[N_MAX],b[N_MAX];
int indf[N_MAX],Nf;
int intr[N_MAX],ut[N_MAX];
int aib[N_MAX];

inline int LSB(int i)
{
	return i&(-i);
}

void update(int ind,int val)
{
	for(int i=ind;i<=Nf;i+=LSB(i))
		aib[i]+=val;
}

int query(int sum)
{
	int i,step;
	for(step=1;step<Nf;step<<=1);
	for(i=0;step;step>>=1)
		if(i+step<=Nf&&aib[i+step]<=sum)
		{
			i+=step;
			sum-=aib[i];
			if(!sum)
				return i;
		}
	return -1;
}

struct cmp
{
	bool operator () (const int &i,const int &j) const
	{
		return lg[i]<lg[j];
	}
};

void bsort(int st,int dr,int poz)
{
	int cifra[10],index[10],i,id;
	memset(cifra,0,sizeof(cifra));
	memset(index,0,sizeof(index));
	for(i=st;i<=dr;i++)
	{
		id=ind[i];
		cifra[a[id][poz]-'0']++;
	}
	index[0]=1;
	for(i=1;i<=9;i++)
	{
		index[i]=index[i-1]+cifra[i-1];
	}
	for(i=st;i<=dr;i++)
	{
		id=ind[i];
		b[st-1+index[a[id][poz]-'0']++]=id;
	}
	for(i=st;i<=dr;i++)
		ind[i]=b[i];
}

void radixsort(int st,int dr,int lg)
{
	for(int i=lg-1;i>=0;i--)
	{
		bsort(st,dr,i);
	}
}

int main()
{
	freopen("nums.in","r",stdin);
	freopen("nums.out","w",stdout);

	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&t);
		if(t)
		{
			scanf("%s",c);
			j=strlen(c);
			lg[++N]=j;
			a[N]=new char [j];
			strcpy(a[N],c);
		}
		else
		{
			scanf("%d",&k);
			intr[i]=k;
		}
	}
	
	for(i=1;i<=N;i++)
		ind[i]=i;

	sort(ind+1,ind+N+1,cmp());

	for(i=1;i<=N;)
	{
		for(j=i;j<=N;j++)
			if(lg[ind[i]]!=lg[ind[j]])
				break;
		j--;
		radixsort(i,j,lg[ind[j]]);
		i=j+1;
	}
	
	for(i=1;i<=N;)
	{
		for(j=i;j<=N;j++)
			if(strcmp(a[ind[i]],a[ind[j]])!=0)
				break;
		indf[++Nf]=ind[i];
		i=j;
	}
	
	for(i=1;i<=Nf;i++)
		ut[indf[i]]=i;

	return 0;
	for(i=1;i<=n;i++)
	{
		nf+=intr[i]==0;
		if(intr[i])
		{
			j=query(intr[i]);
			printf("%s\n",a[indf[j]]);
		}
		else
		{
			if(ut[nf]==0)
				continue;
			update(ut[nf],1);
		}
	}
	return 0;
}