UVA 1339 Ancient Cipher(映射 | 想法)

UVA 1339 Ancient Cipher

题意

给出两个字符串,可以重新排列可以自由映射,把其中的一个字符映射到另一个字符。询问是否存在一种一一映射方式,使得原来的字符串可以映射到目标字符串

解决

  1. 由于可以重新排列,所以字符的位置不重要(这点以后会游泳,记住)
  2. 由于本题中的映射只能一对一,所以要求如果我们记录下26个字符每个字符出现的次数,并对字符出现的次数进行排序,str1(原串)里一个字符出现了n次,那么对应str2(目标串)中也必须存在一个出现n次的字符(且没被用过)。
  3. 所以我们对两个串中字符出现次数进行排序,比较是否完全相同即可
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <complex>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define E 1e-6
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
void open(){freopen("data.txt","r",stdin);}
void out(){freopen("out.txt","w",stdout);}
const int maxn = 101010;
const int MOD = 1e9 + 7;

int main()
{
    char str1[105],str2[105];
    int cnt1[30],cnt2[30];
    while(~scanf("%s",str1))
    {
        scanf("%s",str2);
        memset(cnt1,0,sizeof(cnt1));
        memset(cnt2,0,sizeof(cnt2));
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        rep(i,0,len1) cnt1[str1[i]-'A']++;
        rep(i,0,len2) cnt2[str2[i]-'A']++;

        sort(cnt1,cnt1+26);
        sort(cnt2,cnt2+26);

        bool ok = true;
        rep(i,0,26) if(cnt1[i]!=cnt2[i]) ok = false;
        if(ok) puts("YES");
        else puts("NO");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值