[无聊测试赛] T1 凯撒密码

本题的思路大致为首先解出每个字母所移动的格子数n,然后将所有的字母移动n个格子.

n的解法: 第一行出现最多的字母和E的差就是n(题目后面的提示跳舞小人bfs证明可以理解为出现的频率)

具体实现为利用map存第一行每个字符出现的次数,然后移动全盘就行了

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

posted @   pocafup  阅读(232)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示