第13回日本情報オリンピック 本選 「JOI 紋章(JOI Emblem) 」 AOJ0598
やるだけ
こういう問題嫌いです。
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> P; int n,m; int d[1010][1010][5]; char s[1010][1010]; char joi[3][3]; int ans = 0; int ha[4][4]; int main(){ scanf("%d%d",&m,&n); for(int i = 0;i < m;i++){ cin >> s[i]; } cin >> joi[0] >> joi[1]; for(int i = 0;i < 2;i++){ for(int j = 0;j < 2;j++){ if(joi[i][j] == 'O'){ ha[i][j] = 1; }else if(joi[i][j] == 'I'){ ha[i][j] = 2; } } } for(int i = 0;i < m-1;i++){ for(int j = 0;j < n-1;j++){ int co = 0; P t; for(int k = 0;k < 2;k++){ for(int l = 0;l < 2;l++){ if(s[i+k][j+l] == joi[k][l]){ co++; }else{ t = P(k,l); } } } if(co == 4){ ans++; for(int k = 0;k < 2;k++){ for(int l = 0;l < 2;l++){ for(int k = 0;k < 3;k++){ if(k != ha[k][l]){ d[i+k][j+l][ha[k][l]]--; } } } } }else if(co == 3){ d[t.first+i][t.second+j][ha[t.first][t.second]]++; } } } int plus = 0; for(int i = 0;i < m;i++){ for(int j = 0;j < n;j++){ for(int k = 0;k < 3;k++){ plus = max(plus,d[i][j][k]); } } } printf("%d\n",ans+plus); return 0; }