题解:ABC279C - RANDOM
·题目
链接:Atcoder。
链接:洛谷。
·难度
算法难度:C。
思维难度:B。
调码难度:C。
综合评价:入门。
·算法
map。
·思路
维护出a和b中每一列的字符串,用两个map分别维护出字符串s在a、b的每一列中分别出现过几次。如果两个map维护结果相同就输出Yes,否则输出No。
·代价
O(hw),没有什么是一个h*w的双层循环解决不了的。
·细节
不能用char类型定义a和b,因为不知道h、w的确切范围。
·代码
#include<bits/stdc++.h>
#define S 440000
using namespace std;
map<string,int>e={},f={};
string a[S]={},b[S]={},c[S]={},d[S]={};
int h=0,w=0;
int main(){
scanf("%d%d",&h,&w);
for(int i=1;i<=h;i++){
cin>>a[i];
}
for(int i=1;i<=h;i++){
cin>>b[i];
}
for(int i=1;i<=w;i++){
for(int j=1;j<=h;j++){
c[i].push_back(a[j][i-1]);
d[i].push_back(b[j][i-1]);
}
e[c[i]]=e[c[i]]+1;
f[d[i]]=f[d[i]]+1;
}
for(int i=1;i<=w;i++){
if(e[c[i]]!=f[c[i]]){
printf("No\n");
return 0;
}
}
printf("Yes\n");
return 0;
}
·注意
map里最好不要用“++”。