您的位置:首页 > 其它

POJ-2159-Ancient Cipher-解题报告

2010-12-21 10:54 411 查看
题意是说第一行字符串能否由第二行字符串经过“替代”和“位置转换”后得到。

做题时,实际上只统计两个字符串的各字符出现的“次数”是否相同即可(不必计较这相同次数是否字符也相同)。



算法思想如下:

1)读入两行字符串;

2)分别统计这两行字符串中每个字符出现的次数,并将其结果存在num1[26], num2[26]数组;

3)对上述两个数组进行降序排序;

4)比较两个数组是否相同:若相同,输出“YES”;若不同,输出“NO”。



#include <iostream>
#include <string>
#include <stdlib.h>

#define MAX_LINE_SIZE 100

using namespace std;

int cmp(const void* a, const void* b) {
    return -(*(int*)a - *(int*)b);
}

int main()
{
    string line1, line2;
    cin >> line1 >> line2;
    
    const char *line1Char = line1.c_str();
    const char *line2Char = line2.c_str();
    
    int len = line1.length();
    
    int a[MAX_LINE_SIZE], b[MAX_LINE_SIZE]; //checked tag
    int num1[26], num2[26];
    
    for(int i = 0; i < 26; i++) {
        num1[i] = 0;
        num2[i] = 0;
    }
    
    for(int i = 0; i < MAX_LINE_SIZE; i++) {
        a[i] = 0;
        b[i] = 0;
    }
    
    for(int i = 0; i < len; ++i) {
        if(a[i] == 1) continue;
        num1[line1Char[i] - 'A']++;
        a[i] = 1;
        
        for(int j = i + 1; j < len; ++j) {
                if(a[j] == 1) continue;
                if(line1Char[i] == line1Char[j]) {
                        num1[line1Char[i] - 'A']++;
                        a[j] = 1;
                }
        }
    }
    
    for(int i = 0; i < len; ++i) {
        if(b[i] == 1) continue;
        num2[line2Char[i] - 'A']++;
        b[i] = 1;
        
        for(int j = i + 1; j < len; ++j) {
                if(b[j] == 1) continue;
                if(line2Char[i] == line2Char[j]) {
                        num2[line2Char[i] - 'A']++;
                        b[j] = 1;
                }
        }
    }
    
    qsort(num1, 26, sizeof(num1[0]), cmp);
    qsort(num2, 26, sizeof(num2[0]), cmp);
    
    int eqTag = 1;
    for(int i = 0; i < 26; ++i) {
        if(num1[i] == num2[i]) continue;
        else {
                eqTag = 0;
                break;
        }
    }
    
    if(eqTag == 1)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: