Official

C - Almost Equal Editorial by PCTprobability


この問題では、あり得る全ての並び替え \(N!\) 通りに対して条件を満たすかどうかを愚直に \(\mathrm{O}(NM)\) かけて判定し、条件を満たす並び替えがあれば Yes を、そうでないならば No を出力すればよいです。

さて、問題はどのように実装するかです。これは、C++ だと next_permutation 関数のような機能があります。vector をソートした状態で渡すと、その列を並び替えて作ることが出来る列を全て列挙してくれます。

それぞれの言語でこのような関数が用意されていることが多いため、それを用いて実装をすればよいです。

実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
  int n,m;
  cin>>n>>m;
  vector<string> s(n);
  for(int i=0;i<n;i++) cin>>s[i];
  sort(s.begin(),s.end());
  do{
    bool ok=true;
    for(int i=0;i<n-1;i++){
      int cnt=0;
      for(int j=0;j<m;j++) if(s[i][j]!=s[i+1][j]) cnt++;
      if(cnt!=1) ok=false;
    }
    if(ok){
      cout<<"Yes"<<endl;
      return 0;
    }
  }while(next_permutation(s.begin(),s.end()));
  cout<<"No"<<endl;
}

posted:
last update: