Official

E - 図形のシャッフル/Shuffle the Pattern Editorial by MMNMM


まず、次の問題を考えてみましょう。

#. からなる長さ \(N\) の文字列 \(S,T\) が与えられる。 \(T\) を好きに並べ替えることで \(S\) と一致させることができるか判定せよ。

この問題が \(O(N)\) 時間で解ければ、元の問題は対応する行どうしでこの問題を解き、結果がすべて Yes であるとき、かつそのときに限り Yes と出力することで解くことができます。 なので、この問題を \(O(N)\) 時間で解くことを考えます。

この問題の答えは、\(S\) に含まれる # と \(T\) に含まれる # の個数が等しいとき Yes で、そうでないとき No です。 よって、それぞれに含まれる # の個数を数えることでこの問題が解けました。

実装例は以下のようになります。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main(){
    using namespace std;
    int H, W;
    cin >> H >> W;
    vector<string> S(H), T(H);
    for(auto&& s : S)cin >> s;
    for(auto&& t : T)cin >> t;
    
    for(int i = 0; i < H; ++i){
        if(count(S[i].begin(), S[i].end(), '#') != count(T[i].begin(), T[i].end(), '#')){
            cout << "No" << endl;
            return 0;
        }
    }
    cout << "Yes" << endl;
    return 0;
}

posted:
last update: