1.映射的定义
说到映射之前,先复习一下笛卡尔乘积
设集合 A = {a,b}
设集合 B = {c,d,e}
那么 设 C 为 A,B的笛卡尔乘积,记作 C = AXB
那么 C = {(a,c),(a,d),(a,e),(b,c),(b,d),(b,e)}
即
映射:
2 简单例题:
CF1744A. Number Replacement
题意即判定数字到字符的映射是否合法
看样例
7
5
2 3 2 4 1
cacta
1
50
a
2
11 22
ab
4
1 2 2 1
aaab
5
1 2 3 2 1
aaaaa
6
1 10 2 9 3 8
azzfdb
7
1 2 3 4 1 1 2
abababb
样例分析:
由映射的唯一性就可以判别
即 对任意的 x 属于 A,在B中只有一个唯一的像
不存在 x 在B中有两个像,所以不满足定义,输出 NO
代码如下:
#include<iostream>
#include<unordered_map>
using namespace std;
int t,n;
string s;
int arr[55];
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
cin>>s;
unordered_map<int,char> cm;
bool flag = true;
for(int i=0;i<n;i++){
if(cm.count(arr[i])){
auto ori = cm[arr[i]];
if(s[i]!=ori){
flag = false;
break;
}
}
cm[arr[i]] = s[i];
}
if(flag){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}
点赞