Submission #4140302


Source Code Expand

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;

char c[209][209]; long long H, W, mod = 1000000007;
bool usedx[209], usedy[209];

bool isdifferent(string V) {
	for (int i = 0; i < V.size(); i++) {
		for (int j = i + 1; j < V.size(); j++) { if (V[i] == V[j]) return false; }
	}
	return true;
}

int main() {
	cin >> H >> W;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) cin >> c[i][j];
	}
	if (H == 1) {
		string s1 = ""; for (int i = 0; i < W; i++) s1 += c[0][i];
		string s2 = ""; for (int i = W - 1; i >= 0; i--) s2 += c[0][i];
		if (s1 == s2) cout << "1" << endl;
		else cout << "2" << endl;
		return 0;
	}
	else if (W == 1) {
		string s1 = ""; for (int i = 0; i < H; i++) s1 += c[i][0];
		string s2 = ""; for (int i = H - 1; i >= 0; i--) s2 += c[i][0];
		if (s1 == s2) cout << "1" << endl;
		else cout << "2" << endl;
		return 0;
	}

	string b1 = ""; if (H % 2 == 1) { for (int i = 0; i < W; i++) b1 += c[H / 2][i]; }
	string b2 = ""; if (W % 2 == 1) { for (int i = 0; i < H; i++) b2 += c[i][W / 2]; }

	long long sum = 1;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < W; j++) {
			if (!(i <= (H - 1 - i) && j <= (W - 1 - j))) continue;

			vector<tuple<int, int, int>>vec;
			vec.push_back(make_tuple(1, i, j));
			if (j != (W - 1 - j)) vec.push_back(make_tuple(2, i, W - 1 - j));
			if (i != (H - 1 - i)) vec.push_back(make_tuple(3, H - 1 - i, W - 1 - j));
			if (i != (H - 1 - i) && j != (W - 1 - j)) vec.push_back(make_tuple(4, H - 1 - i, j));
			sort(vec.begin(), vec.end());

			vector<string>ans, ans2; bool flag = false;
			do {
				vector<int>E; for (int k = 0; k < vec.size(); k++) E.push_back(get<0>(vec[k]));

				int ret = 0;
				for (int k = 0; k < E.size(); k++) { for (int l = k + 1; l < E.size(); l++) { if (E[k] > E[l]) ret++; } }
				if (ret % 2 == 0) {
					string rem = "";
					for (int k = 0; k < E.size(); k++) rem += c[get<1>(vec[k])][get<2>(vec[k])];
					ans.push_back(rem);

					if (rem.size() == 4 && isdifferent(rem) == true) flag = true;
				}
			} while (next_permutation(vec.begin(), vec.end()));

			sort(ans.begin(), ans.end()); ans.erase(unique(ans.begin(), ans.end()), ans.end());
			sum *= (long long)(ans.size()); sum %= mod;

			if (flag == true) {
				usedx[i] = true;
				usedy[j] = true;
			}
		}
	}
	bool flag = false;
	for (int i = 0; i < H / 2; i++) { if (usedx[i] == true) { sum *= 2; sum %= mod; flag = true; } }
	for (int i = 0; i < W / 2; i++) { if (usedy[i] == true) { sum *= 2; sum %= mod; flag = true; } }
	if (flag == true) {
		if (sum % 2 == 1)sum += mod;
		sum /= 2;
	}
	string c1 = b1; reverse(c1.begin(), c1.end()); if (b1 != c1) { sum *= 2; sum %= mod; }
	string c2 = b2; reverse(c2.begin(), c2.end()); if (b2 != c2) { sum *= 2; sum %= mod; }
	cout << sum << endl;
	return 0;
}

Submission Info

Submission Time
Task I - Reverse Grid
User E869120
Language C++14 (GCC 5.4.1)
Score 1900
Code Size 2918 Byte
Status AC
Exec Time 85 ms
Memory 256 KB

Judge Result

Set Name sample all
Score / Max Score 0 / 0 1900 / 1900
Status
AC × 2
AC × 39
Set Name Test Cases
sample sample-01.txt, sample-02.txt
all sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01-01.txt AC 1 ms 256 KB
01-02.txt AC 1 ms 256 KB
01-03.txt AC 1 ms 256 KB
01-04.txt AC 1 ms 256 KB
01-05.txt AC 1 ms 256 KB
01-06.txt AC 1 ms 256 KB
01-07.txt AC 1 ms 256 KB
01-08.txt AC 1 ms 256 KB
01-09.txt AC 1 ms 256 KB
01-10.txt AC 76 ms 256 KB
01-11.txt AC 78 ms 256 KB
01-12.txt AC 81 ms 256 KB
01-13.txt AC 75 ms 256 KB
01-14.txt AC 19 ms 256 KB
01-15.txt AC 20 ms 256 KB
01-16.txt AC 83 ms 256 KB
01-17.txt AC 81 ms 256 KB
01-18.txt AC 85 ms 256 KB
01-19.txt AC 83 ms 256 KB
01-20.txt AC 82 ms 256 KB
01-21.txt AC 84 ms 256 KB
01-22.txt AC 4 ms 256 KB
01-23.txt AC 43 ms 256 KB
01-24.txt AC 82 ms 256 KB
01-25.txt AC 82 ms 256 KB
01-26.txt AC 82 ms 256 KB
01-27.txt AC 6 ms 256 KB
01-28.txt AC 13 ms 256 KB
01-29.txt AC 2 ms 256 KB
01-30.txt AC 16 ms 256 KB
01-31.txt AC 82 ms 256 KB
01-32.txt AC 83 ms 256 KB
01-33.txt AC 81 ms 256 KB
01-34.txt AC 82 ms 256 KB
01-35.txt AC 84 ms 256 KB
sample-01.txt AC 1 ms 256 KB
sample-02.txt AC 1 ms 256 KB