zoukankan      html  css  js  c++  java
  • uva1339Ancient Cipher

    【题目描述】:密码

    古典密码学有两种密码,仿射和换位,给定一段明文,一段密文,看密文能否由这段明文,是否可能通过仿射和换位得到。

    【算法分析】:这道题目的关键是读题。因为接触过密码学,所以容易理解。

    仿射密码:M=(m+a)%26,注意:对于相同的字母,仿射到同一个字母

    换位密码:就是把所有的字母重排。

    所以这道提的关键是,无论怎么仿射和置换,不用的字母总数不会增加,相同的字母的个数不会增加。即使通过很多次这样的操作也是这样。所以统计两段密文,不同的字母出现的个数,排序后比较即可。题外话:可能变换成功。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    char str1[101], str2[101];
    int  set1[26], set2[26];
    
    int main()
    {
        while (cin >> str1 >> str2) {
            memset(set1, 0, sizeof(set1));
            memset(set2, 0, sizeof(set2));
            for (int i = 0; str1[i]; ++i)
            {
                set1[str1[i] - 'A'] ++;
                set2[str2[i] - 'A'] ++;
            }
            sort(set1, set1 + 26);
            sort(set2, set2 + 26);
    
            int flag = 1;
            for (int i = 0; i < 26; ++i)
                if (set1[i] != set2[i]) {
                    flag = 0;
                    break;
                }
            if (flag)
                puts("YES");
            else puts("NO");
        }
        return 0;
    }
  • 相关阅读:
    .NET 回归
    Smart ORM v0.4.1开发计划
    计算4的1万次方的结果
    GMS Modem 短信收发组件
    计划任务的编成实现
    告别2007,展望2008
    Smart ORM v0.3发布(完全面向对象的轻量级ORM工具)
    Java中委托事件模型 (转)
    刚刚开通了博客,写点东西
    ASP.NET弹出对话框(转)
  • 原文地址:https://www.cnblogs.com/ArvinShaffer/p/6443234.html
Copyright © 2011-2022 走看看