题解 P1906 【凯撒密码】

这题目有点意思!一开始一定要读清楚题意,第一天看到题,第二天才想到其实吧,这个t,也就是移动的位数一定是要使结果的E最多的,所以其实我们可以在原串中找到出现次数最多的字母,然后往回减(因为是密文转明文)需要用到mapAC此题,12ms:

#include <iostream>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

map <char, int> mp;

string v, b, s;

int main()
{
    while(true)
    {
        cin >> v;
        if(v == "ENDOFINPUT")
        {
            break;
        }
        scanf("\n");
        getline(cin, s);
        transform(s.begin(), s.end(), s.begin(), ::toupper);
        int len = s.length() - 1, max = 0, a;
        char xb;
        for(int i = 0; i <= len; i++)
        {
            if(isalpha(s[i]))
            {
                mp[s[i]]++;
                if(mp[s[i]] >= max)
                {
                    max = mp[s[i]];
                    xb = s[i];
                }
            }
        }
        if(xb == 'E')
        {
            cout << s << endl;
        }
        else
        {
            if(xb > 'E')
            {
                a = (int)xb - (int)'E';
            }
            else
            {
                a = (int)'E' - (int)xb;
            }
for(int i = 0; i <= len; i++)
                {
                    if(isalpha(s[i]))
                    {
                        if(s[i] - a > 'Z' || s[i] - a < 'A')
                        {
                            for(int j = 1; j <= a; j++)
                            {
                                if(s[i] == 'A')
                                {
                                    s[i] = 'Z';
                                    j++;
                                }
                                if(j <= a)
                                {
                                    s[i]--;
                                }
                            }
                        }
                        else
                        {
                            s[i] -= a;
                        }
                    }
                }
            cout << s << endl;
        }
        cin >> b;
    }
    return 0;
}

当然,xb - 'E'其实根本不用转int,map也可以变成hash的unordered_map,10ms:

#include <iostream>
#include <unordered_map>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

unordered_map <char, int> mp;

string v, b, s;

int main()
{
    while(true)
    {
        cin >> v;
        if(v == "ENDOFINPUT")
        {
            break;
        }
        scanf("\n");
        getline(cin, s);
        transform(s.begin(), s.end(), s.begin(), ::toupper);
        int len = s.length() - 1, max = 0, a;
        char xb;
        for(int i = 0; i <= len; i++)
        {
            if(isalpha(s[i]))
            {
                mp[s[i]]++;
                if(mp[s[i]] >= max)
                {
                    max = mp[s[i]];
                    xb = s[i];
                }
            }
        }
        if(xb == 'E')
        {
            cout << s << endl;
        }
        else
        {
            if(xb > 'E')
            {
                a = xb - 'E';
            }
            else
            {
                a = 'E' - xb;
            }
for(int i = 0; i <= len; i++)
                {
                    if(isalpha(s[i]))
                    {
                        if(s[i] - a > 'Z' || s[i] - a < 'A')
                        {
                            for(int j = 1; j <= a; j++)
                            {
                                if(s[i] == 'A')
                                {
                                    s[i] = 'Z';
                                    j++;
                                }
                                if(j <= a)
                                {
                                    s[i]--;
                                }
                            }
                        }
                        else
                        {
                            s[i] -= a;
                        }
                    }
                }
            cout << s << endl;
        }
        cin >> b;
    }
    return 0;
}

那么说一下transform,其实transform功能很强大,不光引用于全部转换为大写或小写,string类型全部转成大写如下:

string s = "kkksc03!!!";//作死
transform(s.begin(), s.end(), s.begin(), ::toupper);

现在, s = "KKKSC03";

由此看来,transform + toupper会将小写转大写,不是字母不转

转小写如下:

string s = "KKK???";
transform(s.begin(), s.end(), s.begin(), ::tolower);

现在, s = "kkk???";

求赞和过

posted @   HappyBobb  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示