当前位置: 首页 > 工具软件 > Ella > 使用案例 >

问题 B: Ella的密码——map

易飞文
2023-12-01

题目描述
Ella 同学在发明自己oj的密码,并将其称作“复制“。
复制密码由一个字符串加密而来,加密的规则如下所示:
原始的字符串为S=s1s2s3…sn(1<=n<=10),Ella使用以下算法:
写下1个s1,
写下2个s2,
写下3个s3,

写下n个sn。
例如 s = “ela”,过程是:“e”->“ell”->“ellaaa”。
接着Ella会把"ellaaa"进行随机排序,显然其中一个结果为"aleala"。
所以一种可能的加密后的密码t为"aleala"。
问题是给定字符串t,t为加密过的字符串,你的任务是破解他并输出原始的字符串。
保证测试的答案存在且均为小写字母且不会包含相同的字符。

输入
第一行包含整数m(1<=m<=55)——加密字符t的长度。
第二行为一行字符串t,即s的加密结果,长度为m。
输出
打印出加密后等于t的字符串s
样例输入 Copy
6
hylhhy
样例输出 Copy
lyh

分析

加密后的字符串是:原字符串第一个字符+1,第二个字符+2,第三个字符+3,所以可以用等差数列求和公式求得原加密前字符串的长度n=(m * m + m) / 2;然后map统计字符出现次数,然后1到n每个字符依次判断输出即可;

#include<bits/stdc++.h>

using namespace std;

map<int, int> ma;
int m;
string s;

int main() {
    cin >> m;
    cin >> s;
    for (int i = 0; i < s.size(); i++) {
        ma[s[i] - 'a']++;
    }
    int n = (m * m + m) / 2;//原始的字符串长度
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 26; j++) {
            if (ma[j] == i) {//字符j出现次数为i
                cout << (char) (j + 'a');
            }
        }
    }
    return 0;
}


 类似资料: