大家看看,哪里错了,为什么只有70分

描述
古罗马帝国有一个拥有各种部门的强大政府组织。其中一个部门就是保密服务部门。为了保险起见,在省与省之间传递的重要文件中的大写字母是加密的。当时最流行的加密方法是替换和重新排列。

替换方法是将所有出现的字符替换成其它的字符。有些字符会替换成它自己。例如:替换规则可以是将'A' 到 'Y'替换成它的下一个字符,将'Z'替换成 'A',如果原词是 "VICTORIOUS" 则它变成 "WJDUPSJPVT"。

排列方法改变原来单词中字母的顺序。例如:将顺序例如将顺序 < 2 1 5 4 3 7 6 10 9 8 > 应用到 "VICTORIOUS" 上,则得到"IVOTCIRSUO"。

人们很快意识到单独应用替换方法或排列方法加密,都是很不保险的。但是如果结合这两种方法,在当时就可以得到非常可靠的加密方法。所以,很多重要信息先使用替换方法加密,再将加密的结果用排列的方法加密。用两种方法结合就可以将"VICTORIOUS" 加密成"JWPUDJSTVP"。

考古学家最近在一个石台上发现了一些信息。初看起来它们毫无意义,所以有人设想它们可能是用替换和排列的方法被加密了。人们试着解读了石台上的密码,现在他们想检查解读的是否正确。他们需要一个计算机程序来验证,你的任务就是写这个验证程序。

输入
输入有两行。

第一行是石台上的文字。文字中没有空格,并且只有大写英文字母。

第二行是被解读出来的加密前的文字。第二行也是由大写英文字母构成的。

两行字符数目的长度都不超过100。

输出
如果第二行经过某种加密方法后可以产生第一行的信息,输出 "YES",否则输出"NO"。

输入样例 1
JWPUDJSTVP
VICTORIOUS
输出样例1
YES
这是我的代码,大家看看哪里错了:

#include<bits/stdc++.h>
using namespace std;
#define N 114514
char a[N],b[N];
int i;
int stone_text[N],Pre_encryption_text[N];
int main(){
    cin>>a>>b;
    int lena=strlen(a);
    int lenb=strlen(b);
    for(i=0;i<lena;i++){
        stone_text[a[i]-'A']++;
    }
    for(i=0;i<lenb;i++){
        Pre_encryption_text[b[i]-'A']++;
    }
    sort(Pre_encryption_text,Pre_encryption_text+a[N]);
    sort(stone_text,stone_text+b[N]);
    for(i=0;i<26;i++){
        if(Pre_encryption_text[i]!=stone_text[i]){
            cout<<"NO";
            return 0;
        }
    }
    cout<<"YES";
    return 0;
}

哦哦哦哦哦哦哦!
是这样的:

using namespace std;
int tong[26],tong1[26],i;
string st,pet;
int main(){
    cin>>st>>pet;
    int lenst=st.size();
    int lenpet=pet.size();
    for(i=0;i<lenst;i++){
        tong[st[i]-'A']++;
    }
    for(i=0;i<lenpet;i++){
        tong1[pet[i]-'A']++;
    }
    sort(tong,tong+26);
    sort(tong1,tong1+26);
    for(i=0;i<26;i++){
        if(tong[i]!=tong1[i]){
            cout<<"NO";
            return 0;
        }
    }
    cout<<"YES";
    return 0;
}

还有别的测试样例吗?
代码:

#include<bits/stdc++.h>
using namespace std;
#define N 105
string a,b; 
int i;
int stone[N],now[N];
int main(){
    cin>>a>>b;
    int lena=a.size();
    int lenb=b.size();
    for(i=0;i<lena;i++){
        stone[a[i]-('B'-'A')]++;
    }
    for(i=0;i<lenb;i++){
        now[b[i]]++;
    }
    for(i=0;i<26;i++){
        if(now[i]!=stone[i]){
            cout<<"NO";
            return 0;
        }
    }
    cout<<"YES";
    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7666478
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析:

    1. 原始字符串和解密后的字符串长度不一样时,直接输出"NO"。这样会忽略掉解密方法是通过替换加密的情况。
    2. 对字符出现的频率进行统计时,预先声明的数组stone_textPre_encryption_text初始值为空,导致统计的结果不准确。
    3. 对数组进行排序时,使用了错误的数组大小,应该是Pre_encryption_textstone_text的大小,而不是a[N]b[N]

    解决方案:

    #include <bits/stdc++.h>
    
    using namespace std;
    #define N 26
    
    int main() {
        char a[N], b[N];
        cin >> a >> b;
    
        int stone_text[N] = {0};
        int Pre_encryption_text[N] = {0};
        int lena = strlen(a);
        int lenb = strlen(b);
    
        // 统计字符出现的频率
        for (int i = 0; i < lena; i++) {
            stone_text[a[i] - 'A']++;
        }
        for (int i = 0; i < lenb; i++) {
            Pre_encryption_text[b[i] - 'A']++;
        }
    
        // 排序数组
        sort(Pre_encryption_text, Pre_encryption_text + N);
        sort(stone_text, stone_text + N);
    
        // 比较两个数组是否相同
        for (int i = 0; i < N; i++) {
            if (Pre_encryption_text[i] != stone_text[i]) {
                cout << "NO";
                return 0;
            }
        }
    
        cout << "YES";
        return 0;
    }
    

    为什么只得了70分?

    1. 因为初始数组stone_textPre_encryption_text没有初始化为0,导致统计的结果不准确。
    2. 数组排序时使用了错误的数组大小。
    3. 没有考虑解密方法可能是通过替换加密的情况。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^