比赛 20111110 评测结果 AAAATTTTTT
题目名称 韩国明星 最终得分 40
用户昵称 Truth.Cirno 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 11:15:18
显示代码纯文本
  1. //对于100%的数据,保证N<=100000 -8888<=Change<=8888 K<=100000.
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <cstring>
  6. using namespace std;
  7.  
  8. int len[100001]={0},sco[100001]={0};
  9. char nam[100001][101]={{0}};
  10.  
  11. void swapint(int& a,int& b)
  12. {
  13. int temp;
  14. temp=a;
  15. a=b;
  16. b=temp;
  17. }
  18.  
  19. void swapallchar(int posa,int posb)
  20. {
  21. int i;
  22. char temp;
  23. if (len[posa]>len[posb])
  24. {
  25. for (i=0;i<=len[posb];i++)
  26. {
  27. temp=nam[posa][i];
  28. nam[posa][i]=nam[posb][i];
  29. nam[posb][i]=temp;
  30. }
  31. for (i=len[posb]+1;i<=len[posa];i++)
  32. nam[posb][i]=nam[posa][i];
  33. }
  34. else
  35. {
  36. for (i=0;i<=len[posa];i++)
  37. {
  38. temp=nam[posa][i];
  39. nam[posa][i]=nam[posb][i];
  40. nam[posb][i]=temp;
  41. }
  42. for (i=len[posa]+1;i<=len[posb];i++)
  43. nam[posa][i]=nam[posb][i];
  44. }
  45. }
  46.  
  47. void qqsort1(int l,int r)
  48. {
  49. int ll,rr,temp;
  50. ll=l;
  51. rr=r;
  52. temp=len[rand()%(r-l+1)+l];
  53. while (ll<=rr)
  54. {
  55. while (len[ll]<temp)
  56. ll++;
  57. while (temp<len[rr])
  58. rr--;
  59. if (ll<=rr)
  60. {
  61. swapallchar(ll,rr);
  62. swapint(len[ll],len[rr]);
  63. ll++;
  64. rr--;
  65. }
  66. }
  67. if (l<rr)
  68. qqsort1(l,rr);
  69. if (ll<r)
  70. qqsort1(ll,r);
  71. }
  72.  
  73. void check(int aimlen,int& l,int& r)
  74. {
  75. int mid;
  76. mid=(l+r)/2;
  77. while (l<r)
  78. {
  79. if (len[mid]==aimlen)
  80. break;
  81. else if (len[mid]<aimlen)
  82. l=mid+1;
  83. else if (len[mid]>aimlen)
  84. r=mid-1;
  85. mid=(l+r)/2;
  86. }
  87. l=mid;
  88. r=mid;
  89. while (len[l]==len[mid])
  90. l--;
  91. while (len[r]==len[mid])
  92. r++;
  93. l++;
  94. r--;
  95. }
  96.  
  97. void qqsort2(int l,int r)
  98. {
  99. int ll,rr,temp;
  100. ll=l;
  101. rr=r;
  102. temp=sco[rand()%(r-l+1)+l];
  103. while (ll<=rr)
  104. {
  105. while (sco[ll]>temp)
  106. ll++;
  107. while (temp>sco[rr])
  108. rr--;
  109. if (ll<=rr)
  110. {
  111. swapallchar(ll,rr);
  112. swapint(sco[ll],sco[rr]);
  113. ll++;
  114. rr--;
  115. }
  116. }
  117. if (l<rr)
  118. qqsort2(l,rr);
  119. if (ll<r)
  120. qqsort2(ll,r);
  121. }
  122.  
  123. int main(void)
  124. {
  125. freopen("star.in","r",stdin);
  126. freopen("star.out","w",stdout);
  127. int i,j,n,k,l,r,change,aimlen;
  128. char aim[101];
  129. scanf("%d\n",&n);
  130. for (i=1;i<=n;i++)
  131. {
  132. scanf("%[^\n]\n",&nam[i]);
  133. len[i]=strlen(nam[i]);
  134. }
  135. qqsort1(1,n);
  136. scanf("%d\n",&k);
  137. for (i=1;i<=k;i++)
  138. {
  139. scanf("%[^\n]\n%d\n",&aim,&change);
  140. aimlen=strlen(aim);
  141. l=1;
  142. r=n;
  143. check(aimlen,l,r);
  144. for (j=l;j<=r;j++)
  145. if (strcmp(aim,nam[j])==0)
  146. {
  147. sco[j]+=change;
  148. break;
  149. }
  150. }
  151. qqsort2(1,n);
  152. for (i=1;i<=n;i++)
  153. printf("%s\n%d\n",nam[i],sco[i]);
  154. fclose(stdin);
  155. fclose(stdout);
  156. return(0);
  157. }