码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2159 Ancient Cipher【字符密码】

时间:2015-03-28 10:08:44      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2159


题目大意:

古罗马帝王的保密服务部门的保密方法是替换和重新排列。

替换方法是将出现的字符替换成其他的字符。如将‘A‘替换成‘Z‘,将‘Z‘替换成‘A‘。

排列方法是改变原来单词中字母的顺序。例如将顺序变为<2,1,5,4,3,7,6,10,9,8>。应用到字符串

"VICTORIOUS"上,则可以得到"IVOTCIRSUO"。

单用一种解密方法是不安全的,只有将两种方法结合起来才安全。那么问题来了:给你一个原文

字符串和加密字符串,问是否能通过这两种加密方法结合,从而由原文信息得到加密信息。如果

能则输出"YES",否则输出"NO"。


思路:

其实这道题没那么复杂,只要用两个数组分别存下两个字符串中各个字母的个数,排序一下,比较

字母个数是不是都相等就可以了,如果不是全相等,则说明不能从原文信息得到加密信息。如果全

相等,则一定有方法从原文信息得到加密信息。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

char s1[110],s2[110];
int a[28],b[28];

int main()
{

    while(~scanf("%s%s",s1,s2))
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        for(int i = 0; i < len1; ++i)
            a[s1[i]-'A']++;
        for(int i = 0; i < len2; ++i)
            b[s2[i]-'A']++;
        sort(a,a+26);
        sort(b,b+26);
        int flag = 1;
        for(int i = 0; i < 26; ++i)
        {
            if(a[i] != b[i])
            {
                flag = 0;
                break;
            }
        }

        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }

    return 0;
}


POJ2159 Ancient Cipher【字符密码】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/44679903

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!