首页 > 其他 > 详细

[NOIp2009]潜伏者 题解

时间:2019-10-18 10:15:03      阅读:53      评论:0      收藏:0      [点我收藏+]

题面

做法:模拟


我们先定义三个char数组:
a -> 小 C掌握的一条加密信息
b -> 加密信息所对应的原信息
c -> R国司令部要求小C翻译的加密信息

具体做法:

  1. 读入(不讲)
  2. 一个特判:若输入a数组长度<=26,直接输出“Failed”,因为题目要求必须26个字母都需要有对应的字母
  3. for循环将a数组字符通过map映射与b数组对应字符建立联系,同时加一重判定,检查当前字符是否之前用过,字符是否与不同字符建立联系
  4. for循环查看26个字母是否都被赋值
  5. for循环将c数组字符对应到b数组并输出
  6. return 0

总时间复杂度:O(len(a+c))


具体见代码:

#include <bits/stdc++.h>

const int N = 100010; //题中没有要求,可自己随意开,但尽量开大些
using namespace std;

char a[N], b[N], c[N];
map <char, char> m;
map <char, char> check;

int main () {
    scanf ("%s%s%s", a, b, c);
    int len = strlen (a);
    if (len < 26) {
        cout << "Failed" << endl;
        return 0;
    }
    for (int i = 0; i < len; i++) {
        if (check[b[i]]) {//反向搜索,其中有一个点需要反过来查错
            if (check[b[i]] != a[i]) {
                cout << "Failed" << endl;
                return 0;
            }
        }
        if (m[a[i]]) {//正向搜索,没有反向可拿90pts
            if (m[a[i]] != b[i]) {
                cout << "Failed" << endl;
                return 0;
            }
        }
        else {
            m[a[i]] = b[i];
            check[b[i]] = a[i];
        }
    }
    for (int i = 1; i <= 26; i++) {//查看26个字母是否都被赋值
        if (!m[(char)(i+'A'-1)]) {
            cout << "Failed" << endl;
            return 0;
        }
    }
    len = strlen (c);
    for (int i = 0; i < len; i++) {//输出
        cout << m[c[i]];
    }
    cout << endl;
    return 0;
}

[NOIp2009]潜伏者 题解

原文:https://www.cnblogs.com/Jason-L/p/11696452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!