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

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

  • 0
    @ 2024-12-23 13:47:28
    #include <stdio.h>
    #include <string.h>
    int main()
    {
        char a[200],b[200],c[200];
        scanf("%s%s%s",a,b,c);
        int num[200]={0};
        for(int i=0;i<strlen(a);i++)
            if(num[(int)b[i]]==0)num[(int)b[i]]=a[i];
        int pos,count;
        for(int i='a';i<='z';i++)
            if(num[i]==0)pos=i;
            else count++;
        if(count==25)
        {
            int alpha[200];
            for(int i='a';i<='z';i++)
            {
                alpha[num[i]]=1;
            }
            for(int i='a';i<='z';i++)
            {
                if(alpha[i]!=1)
                    num[pos]=i;
            }
        }
        for(int i=0;i<strlen(c);i++)
        {
            c[i]=num[(int)c[i]];
            if(c[i]==0){printf("-1");return 0;}
        }
        printf("%s",c);
        return 0;
    }//有手就行
    
    • 1

    信息

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