hdu1880

/*
分析:
    快排+二分。
    一开始看到题后用的字典树,就是一道字典树的果题么,
但是总MLE,改来改去还是超了那么一点儿点儿。。。于是就
换了个思路,快排+二分。
    果题,没什么需要多说的了。。


                                                          2012-11-20
*/












#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 100011
struct A
{
	char str[25];
	int index;
}e1[N];
struct B
{
	char str[85];
	int index;
}e2[N];
int tot;
int cmp1(const void *a,const void *b)
{
	A *c,*d;
	c=(A *)a;
	d=(A *)b;
	return strcmp(c->str,d->str);
}
int cmp2(const void *a,const void *b)
{
	B *c,*d;
	c=(B *)a;
	d=(B *)b;
	return strcmp(c->str,d->str);
}
int main()
{
	int n;
	int i,l,j;
	char str[111],str1[111],str2[111];

	tot=0;
	while(gets(str),strcmp(str,"@END@"))
	{
		for(j=0,l=1;str[l]!=']';l++,j++)	str1[j]=str[l];
		str1[j]=0;
		for(j=0,l+=2;str[l];l++,j++)		str2[j]=str[l];
		str2[j]=0;
		strcpy(e1[tot].str,str1);
		strcpy(e2[tot].str,str2);
		e1[tot].index=tot;
		e2[tot].index=tot;
		tot++;
	}

	qsort(e1,tot,sizeof(e1[0]),cmp1);
	for(i=0;i<tot;i++)	e2[e1[i].index].index=i;
	qsort(e2,tot,sizeof(e2[0]),cmp2);
	for(i=0;i<tot;i++)	e1[e2[i].index].index=i;

	int flag,temp;
	int low,mid,up;
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		flag=0;
		gets(str);
		if(str[0]=='[')
		{
			flag=1;
			for(j=0,l=1;str[l]!=']';l++,j++)	str[j]=str[l];
			str[j]=0;
		}

		low=0;up=tot-1;mid=(low+up)>>1;
		if(flag)
		{
			while(low<=up)
			{
				temp=strcmp(str,e1[mid].str);
				if(temp>0)	low=mid+1;
				else		up=mid-1;
				mid=(low+up)>>1;
			}
			if(strcmp(e1[low].str,str)==0)	printf("%s\n",e2[e1[low].index].str);
			else							printf("what?\n");
		}
		else
		{
			while(low<=up)
			{
				temp=strcmp(str,e2[mid].str);
				if(temp>0)	low=mid+1;
				else		up=mid-1;
				mid=(low+up)>>1;
			}
			if(strcmp(e2[low].str,str)==0)	printf("%s\n",e1[e2[low].index].str);
			else							printf("what?\n");
		}
	}

	return 0;
}


你可能感兴趣的:(hdu1880)