[ABC279C] RANDOM 题解
思路
我们需要交换 \(A\) 中的任意两列,使 \(A\) 变成 \(B\)。
考虑一个显然的性质:如果 \(A\) 中的每一列都可以在 \(B\) 中找到相同的一列(注意 \(A\) 中不能有多列对应 \(B\) 中的一列),那么 \(A\) 一定可以变成 \(B\),否则不能。那么根据此性质,我们直接模拟即可。
注意因为数据范围是 \(\le 4\times 10^5\),所以不能直接暴力查找,需要用 STL 中的 map
容器。
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+45;
int n,m;
string s,a1[N],b1[N];
map<string,int>vis;
bool ok=1;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a1[i];
for(int i=0;i<n;i++)
cin>>b1[i];
for(int j=0;j<m;j++){
s.clear();
for(int i=0;i<n;i++)s+=b1[i][j];
vis[s]++;//记录每一列
}
for(int j=0;j<m&&ok;j++){
s.clear();
for(int i=0;i<n;i++)s+=a1[i][j];
ok=(bool)vis[s];//如果没有相同的则一定不能转换
vis[s]--;//A中不能有多列对应B中的一列,所以对应了一列就要减去一列
}
if(ok)cout<<"Yes";
else cout<<"No";
return 0;
}
```AT_abc279_c