POJ 2159 Ancient Cipher(古老的密码)

来源:互联网 发布:彩卡网络下单系统 编辑:程序博客网 时间:2024/06/01 20:37

题目链接:POJ 2159

也是UVA 1339

题意:

给定两个长度相同且不超过100的字符串,判断能否把其中一个字符串的各个字符重排,然后对26个字母做一个一一映射,使得两个字符串相同。

思路:

字符的位置不重要,重要的是出现次数。先统计两个字符各个字符出现的次数,得到两个数组。由于映射的规则不是固定的,那么只要这两个数组排序后的结果相同,那么输入的两个字符串就可以通过重排和一一映射变得相同。

#include <stdio.h>#include <string.h>#define maxn 110char s1[maxn], s2[maxn];int a1[27], a2[27],len,i,flag,t;void sorta(int a[], int len){int k;for (int i = 0;i < len-1;i++) {k = i;for (int j = i + 1;j < len;j++) if (a[k] > a[j]) k = j;if (k != i) {t = a[i];a[i] = a[k];a[k] = t;}}}int main(){while (~scanf("%s%s", s1, s2)) {len = strlen(s1);flag = 1;memset(a1, 0, sizeof(a1));memset(a2, 0, sizeof(a2));for (i = 0;i < len;i++) {a1[s1[i] - 'A']++;a2[s2[i] - 'A']++;}sorta(a1, 26);sorta(a2, 26);for (i = 0;i < 26;i++)if (a1[i] != a2[i]) {flag = 0;break;}if (flag) printf("YES\n");else printf("NO\n");}return 0;}

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;char s[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";char s1[110], s2[110];int cnt1[27], cnt2[27];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifwhile (~scanf("%s%s", s1, s2)){memset(cnt1, 0, sizeof(cnt1));memset(cnt2, 0, sizeof(cnt2));for (int i = 0;s1[i];i++){cnt1[strchr(s, s1[i]) - s]++;cnt2[strchr(s, s2[i]) - s]++;}sort(cnt1, cnt1+26);sort(cnt2, cnt2+26);int flag = 1;for (int i = 0;i < 26;i++){if (cnt1[i] != cnt2[i]){flag = 0;break;}}if (flag) printf("YES\n");else printf("NO\n");}return 0;}


0 0
原创粉丝点击