intさわだんのBlack History

刹那的レジェンドになりたい。

第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;
}