[ボーリングテストイベント] T1シーザー暗号

この問題を考えると、実質的にモバイルグリッド数の各々の最初の文字について解くN、およびすべての文字n個の正方形を移動させます。

Nの溶液:最初の行が現れる最大と文字E nとの間の差(ダンス悪役のBFSを提示後者のタスクは出現頻度として理解されるべきで証明)

次に、各文字が表示され、最初の行に格納されたマップを用い回数ラインの全体的な動きとして具現

C ++の利点は、彼が本来のTOUPPER()、のtolower()とはisalpha()を持っていることである。これらの質問には注意を払うために必要なすべての答えでは大文字に変換されます。私のソリューションは、直接入力され、その後、統計を大文字に変換しました

#include <cctype>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <unordered_map>
using namespace std;
unordered_map<char,int> mp;
char adj[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M',
                'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//懒得想
int num = -1,maxi = 0, diff = -1;
string strs[1005];
inline void shift(char curr){
  if (!isalpha(curr)) {cout << curr; return;}
  cout << adj[((int)curr+diff-'A')%26];
}//移位
int main(){
  string s; cin >> s;
  while(s!="ENDOFINPUT"){
    if (s=="START"){
      getline(cin,s);
      getline(cin,s);//2个getline才行,cin.ignore()会爆.不要问为啥,这题我0分的原因就在此
      for (int i=0;i<s.length();i++) s[i] = toupper(s[i]);
      if (num==-1) {//如果不知道要移多少
        for (int i=0;i<s.length();i++) mp[s[i]]++;
        for (int i=0;i<26;i++) if (mp[adj[i]]>maxi){
          maxi = mp[adj[i]];
          num = i;
        }//统计
        diff = (30-num)%26;//E是第五个字符,在我的列表里为第四个,由于怕-num得到负数,故+26得到30
      }
      for (int i=0;i<s.length();i++) shift(s[i]);//移动
      cout << endl;
    }
    cin >> s;
  }
}

ピットの小さなは、慎重にAを指し示すことができるようになります

おすすめ

転載: www.cnblogs.com/DannyXu/p/12536346.html