POJ-2159-Ancient Cipher-解题报告

题意是说第一行字符串能否由第二行字符串经过“替代”和“位置转换”后得到。
做题时,实际上只统计两个字符串的各字符出现的“次数”是否相同即可(不必计较这相同次数是否字符也相同)。

 

算法思想如下:
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; }

 

你可能感兴趣的:(算法,String)