比赛 |
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);
}