记录编号 141941 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]悄悄话 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.060 s
提交时间 2014-12-05 10:39:28 内存使用 0.35 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<set>
  6. using namespace std;
  7. const int WORD_NUM=20,SIZEL=10010;
  8. string dict_lis[WORD_NUM]={"you","it","he","do","they","we","i","and"
  9. ,"but","how","was","is","are","the","on","in","of","to","all","a"};
  10. set<string> dict;
  11. int c_val[26]={0};
  12. bool lowercase(char c){
  13. return 'a'<=c&&c<='z';
  14. }
  15. void prepare(void){
  16. for(int i=0;i<WORD_NUM;i++) dict.insert(dict_lis[i]);
  17. char t1[]={'e','t','a','o','i','n','s','r'};//常见字
  18. char t2[]={'z','q','j','x','k','v','b','p'};//不常见字
  19. for(int i=0;i<8;i++) c_val[t1[i]-'a']++,c_val[t2[i]-'a']--;
  20. }
  21. int calc(string &s,int type[]){
  22. int ans=0;
  23. for(int i=0;i<s.size();i++){
  24. if(lowercase(s[i])) ans+=c_val[s[i]-'a'];//统计字母权值
  25. if(s[i]=='i'&&type[i]==1){
  26. ans+=5;//特判单词"I"
  27. if(i+1<s.size()&&s[i+1]=='\'') ans+=3;//特判"I'",因为这是唯一的"单字+'"
  28. }
  29. if(s[i]=='\'')//特判:"'s"和"'m"
  30. if(i+1<s.size()&&(s[i+1]=='m'||s[i+1]=='s')) ans+=4;
  31. }
  32. int i=0,j;
  33. while(i<s.size()){
  34. while(i<s.size()&&!lowercase(s[i])) i++;
  35. string t="\0";
  36. j=i;
  37. while(j<s.size()&&lowercase(s[j])) t+=s[j++];
  38. if(dict.count(t)) ans+=4;//出现单词
  39. i=j;
  40. }
  41. return ans;
  42. }
  43. int type[SIZEL]={0};//小写0大写1其余2
  44. string text[26];
  45. void turn_mark(string &s){//转小写并且在type中标记类型
  46. for(int i=0;i<s.size();i++){
  47. if('A'<=s[i]&&s[i]<='Z'){
  48. s[i]+='a'-'A';
  49. type[i]=1;
  50. }
  51. else if(!lowercase(s[i])) type[i]=2;
  52. }
  53. }
  54. void crypt(string &a,string &b,int k){//试图以偏移量k解密
  55. b="\0";
  56. for(int i=0;i<a.size();i++){
  57. if(lowercase(a[i])) b+=char('a'+(a[i]-'a'+k)%26);
  58. else b+=a[i];
  59. }
  60. }
  61. void print(string &s){
  62. for(int i=0;i<s.size();i++)
  63. if(type[i]==1) s[i]+='A'-'a';
  64. cout<<s<<endl;
  65. }
  66. void work(void){
  67. int mx=0,id=0;
  68. memset(type,0,sizeof(type));
  69. getline(cin,text[0]);
  70. turn_mark(text[0]);
  71. for(int i=1;i<26;i++) crypt(text[0],text[i],i);//尝试不同的解密姿势
  72. for(int i=0;i<26;i++){
  73. int now=calc(text[i],type);
  74. if(now>mx){
  75. mx=now;
  76. id=i;
  77. }
  78. }
  79. print(text[id]);
  80. }
  81. int main(){
  82. freopen("msg.in","r",stdin);
  83. freopen("msg.out","w",stdout);
  84. prepare();
  85. int T=10;
  86. while(T--) work();
  87. return 0;
  88. }