[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
posted @ 2022-11-30 11:42  ASnown  阅读(26)  评论(0编辑  收藏  举报