【NOIP2018 模拟赛day1】古代密码

【题目描述】

古罗马帝国有一个拥有各种部门的强大政府组织。其中一个部门
就是保密服务部门。 为了保险起见, 在省与省之间传递的重要文件中
的大写字母是加密的。 当时最流行的加密方法是替换和重新排列。
替换方法是将所有出现的字符按照一个规则替换, 比如
ABCDEFGHIJKLMNOPQRSTUVWXYZ 到 BCDEFGHIJKLMNOPQRSTUVWXYZA, 如
果原词是 “VICTORIOUS” 则它变成 “WJDUPSJPVT”。
排列方法改变原来单词中字母的顺序。 例如: 将顺序<2, 1, 5, 4,
3, 7, 6, 10, 9, 8>应用到 “VICTORIOUS” 上, 则得到”IVOTCIRSUO”。
人们很快意识到单独应用替换方法或排列方法加密, 都是很不保
险的。 但是如果结合这两种方法, 在当时就可以得到非常可靠的加密
方法。 所以, 很多重要信息先使用替换方法加密, 再将加密的结果用
排列的方法加密。 用两种方法结合就可以将”VICTORIOUS” 加密成
“JWPUDJSTVP”。
考古学家最近在一个石台上发现了一些信息。 初看起来它们毫无
意义, 所以有人设想它们可能是用替换和排列的方法被加密了。 人们
试着解读了石台上的密码, 现在他们想检查解读的是否正确。 他们需
要一个计算机程序来验证, 你的任务就是写这个验证程序。

  • 【输入描述】
    输入有两行。 第一行是石台上的文字。 文字中没有空格, 并且只
    有大写英文字母。 第二行是被解读出来的加密前的文字。 第二行也是由大写英文字母构成的。
    两行字符数目的长度都不超过 100。
  • 【输出描述】
    如果第二行经过某种加密方法后可以产生第一行的信息, 输出
    “YES”, 否则输出”NO”。
  • 【样例】
    JWPUDJSTVP
    VICTORIOUS
    YES
  • 【数据范围】
    对于 30%的数据: 字符串长度<=10
    对于 50%的数据: 字符串长度<=50
    对于 100%的数据: 字符串长度<=100

题解

–题目中,原文的加密方法既要交换字母,又要随机排序,其实就与顺序无关了,反而简化了问题:只需要判断明文与密文各个字母的出现次数就行了。
–如果密码要可以成功匹配,显然明文与密码中所有各自要交替的字母的出现次数要相同,所以在保存下每个字母的出现次数后,用sort排序,在比对两个数组是否相同就行了。
–不过神奇的事情是,第一次是我还加了一个特判,然后WA了,可能是想多了吧……


代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=105;

string s1,s2;
int l1,l2;
int a1[MAXN],a2[MAXN];

bool comp(const int &a,const int &b){
    return a>b;
}

bool solve(){
    for(int i=1;i<=27;i++)
        if(a1[i]!=a2[i])
            return 0;
    return 1;
}

int main(){
//  freopen("cryptogram.in","r",stdin);
//  freopen("cryptogram.out","w",stdout);
    cin>>s1>>s2;
    l1=s1.length();
    l2=s2.length();
    for(int i=0;i<l1;i++){
        int b=s1[i]-'A'+1;
        a1[b]++;
    }
    for(int i=0;i<l2;i++){
        int b=s2[i]-'A'+1;
        a2[b]++;
    }
    sort(a1+1,a1+27,comp);
    sort(a2+1,a2+27,comp);
    if(!solve())
        cout<<"NO";
    else
        cout<<"YES";
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NOI(全国青少年信息学奥林匹克竞)模拟的测试数据是指用于评测参选手的程序的输入和对应的输出。测试数据是非常重要的,因为它决定了参选手的程序能否正确地解决问题。 在NOI模拟中,测试数据具有以下特点: 1.充分覆盖:测试数据应涵盖各种可能的输入情况,包括边界条件和极端情况。通过提供不同的测试数据,可以考察选手对问题的全面理解和解决能力。 2.随机性和均衡性:为了公平起见,测试数据应该是随机生成的,而不是针对某个特定算法或解法设计的。同时,测试数据应该是均衡的,即各种情况的概率应该大致相等,以避免偏向某些解法。 3.合理性和可行性:测试数据应该是合理和可行的,即符合题目要求的输入数据,并且是选手能够通过编写程序来处理的。测试数据应该考虑到程序的限制和时间复杂度,以充分测试选手的编程能力。 NOI模拟的测试数据通常由经验丰富的考题组负责生成。他们会根据题目的要求和限制,设计出一组合理、充分、随机和均衡的测试数据,以确保参选手的程序在各种情况下都能正确运行,并且能通过性能测试。 总之,测试数据在NOI模拟中起到了至关重要的作用,它既考察了选手对问题的理解和解决能力,又提高了选手编程的技巧和效率。同时,合理和恰当的测试数据也是公平竞的保证,确保每个参选手有相同的机会和条件进行竞争。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值