比赛 20111110 评测结果 AAAATTTTTT
题目名称 韩国明星 最终得分 40
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 11:15:18
显示代码纯文本
//对于100%的数据,保证N<=100000 -8888<=Change<=8888 K<=100000.
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;

int len[100001]={0},sco[100001]={0};
char nam[100001][101]={{0}};

void swapint(int& a,int& b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

void swapallchar(int posa,int posb)
{
	int i;
	char temp;
	if (len[posa]>len[posb])
	{
		for (i=0;i<=len[posb];i++)
		{
			temp=nam[posa][i];
			nam[posa][i]=nam[posb][i];
			nam[posb][i]=temp;
		}
		for (i=len[posb]+1;i<=len[posa];i++)
			nam[posb][i]=nam[posa][i];
	}
	else
	{
		for (i=0;i<=len[posa];i++)
		{
			temp=nam[posa][i];
			nam[posa][i]=nam[posb][i];
			nam[posb][i]=temp;
		}
		for (i=len[posa]+1;i<=len[posb];i++)
			nam[posa][i]=nam[posb][i];
	}
}

void qqsort1(int l,int r)
{
	int ll,rr,temp;
	ll=l;
	rr=r;
	temp=len[rand()%(r-l+1)+l];
	while (ll<=rr)
	{
		while (len[ll]<temp)
			ll++;
		while (temp<len[rr])
			rr--;
		if (ll<=rr)
		{
			swapallchar(ll,rr);
			swapint(len[ll],len[rr]);
			ll++;
			rr--;
		}
	}
	if (l<rr)
		qqsort1(l,rr);
	if (ll<r)
		qqsort1(ll,r);
}

void check(int aimlen,int& l,int& r)
{
	int mid;
	mid=(l+r)/2;
	while (l<r)
	{
		if (len[mid]==aimlen)
			break;
		else if (len[mid]<aimlen)
			l=mid+1;
		else if (len[mid]>aimlen)
			r=mid-1;
		mid=(l+r)/2;
	}
	l=mid;
	r=mid;
	while (len[l]==len[mid])
		l--;
	while (len[r]==len[mid])
		r++;
	l++;
	r--;
}

void qqsort2(int l,int r)
{
	int ll,rr,temp;
	ll=l;
	rr=r;
	temp=sco[rand()%(r-l+1)+l];
	while (ll<=rr)
	{
		while (sco[ll]>temp)
			ll++;
		while (temp>sco[rr])
			rr--;
		if (ll<=rr)
		{
			swapallchar(ll,rr);
			swapint(sco[ll],sco[rr]);
			ll++;
			rr--;
		}
	}
	if (l<rr)
		qqsort2(l,rr);
	if (ll<r)
		qqsort2(ll,r);
}

int main(void)
{
	freopen("star.in","r",stdin);
	freopen("star.out","w",stdout);
	int i,j,n,k,l,r,change,aimlen;
	char aim[101];
	scanf("%d\n",&n);
	for (i=1;i<=n;i++)
	{
		scanf("%[^\n]\n",&nam[i]);
		len[i]=strlen(nam[i]);
	}
	qqsort1(1,n);
	scanf("%d\n",&k);
	for (i=1;i<=k;i++)
	{
		scanf("%[^\n]\n%d\n",&aim,&change);
		aimlen=strlen(aim);
		l=1;
		r=n;
		check(aimlen,l,r);
		for (j=l;j<=r;j++)
			if (strcmp(aim,nam[j])==0)
			{
				sco[j]+=change;
				break;
			}
	}
	qqsort2(1,n);
	for (i=1;i<=n;i++)
		printf("%s\n%d\n",nam[i],sco[i]);
	fclose(stdin);
	fclose(stdout);
	return(0);
}