公式

B - Count Subgrid 解説 by kyopro_friends


問題原案:admin

この問題のようにあるものが何種類あるかを求めるには、数える対象のものを全てsetに入れてそのサイズを求めるのが簡単です。

取り出した \(M\times M\) の領域を適当な状態に持ってsetに入れましょう。

実装例(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];

  set<vector<string>>grid_set;
  for(int i=0;i<N-M+1;i++)for(int j=0;j<N-M+1;j++){
    vector<string>grid;
    for(int ii=i;ii<i+M;ii++)grid.push_back(S[ii].substr(j,M));
    grid_set.insert(grid);
  }

  cout << grid_set.size() << endl;
}

pythonの場合、listをsetに入れることはできないので、tupleを用いる必要があります。

実装例(Python)

N,M=map(int,input().split())
S=[input() for _ in range(N)]

grid_set=set()
for i in range(N-M+1):
  for j in range(N-M+1):
    grid = tuple(S[ii][j:j+M] for ii in range(i,i+M))
    grid_set.add(grid)

print(len(grid_set))

投稿日時:
最終更新: