2 条题解

  • 2
    @ 2024-12-20 19:52:18

    我就简单讲一下我的代码的思路(学了c++的map头文件的更容易解决).

    首先,看题给的提示可以想出,每一个字母都有一一对的关系,但我们从样例3中可以看出,它有一个字母的关系是要我们自己推的,从初始密码可以数出有26种字母,而解密的密码只有25种。

    我只需要定义两个容器,这两个容器是来找那个需要我们自己推断的字母,有这个字母我就+1,没有的则为0,以此遍历,到最后找到这个需要我们推的字母。

    **一定要搞清楚键和值,别混淆了

    ***注:map函数自带排序,从小到大,并且元素是唯一的,eg:bcjdddj 输出就是bcdj

    #include <iostream>

    #include <map>

    using namespace std;

    int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    cout.tie(0);

    string a, b, c;

    cin >> a;

    cin >> b;

    cin >> c;

    map<char, char>mp;

    map<char, int>r1, r2;

    int cs = 0;

    for (size_t i = 0; i < a.size(); i++) {

    mp[b[i]] = a[i];

    if (!r1[b[i]]) {

    cs++;//找26种英文字母出现次数

    r1[b[i]]++;

    }

    }

    char p;

    if (cs == 25) {

    for (size_t i = 0; i < a.size(); i++) {

    r2[a[i]]++;

    } for (char al = 'a'; al <= 'z'; al++) {

    if (!r2[al]) {

    p = al;

    break;

    }

    }

    }

    string al = "";

    int pd = 1;

    for (size_t l = 0; l < c.size(); l++) {

    if (mp.find(c[l]) != mp.end()) {

    al += mp[c[l]];

    } else if (cs == 25) {

    al += p;

    } else {

    pd = 0;

    break;

    }

    }

    if (!pd) {

    cout << -1 << endl;

    } else {

    cout << al << endl;

    } return 0;

    }

    • @ 2024-12-20 19:53:01

      看看思路就行,没有必要强迫自己看我的代码 😏😏😏

信息

ID
1091
时间
1000ms
内存
256MiB
难度
8
标签
(无)
递交数
280
已通过
37
上传者