結果
| 問題 |
No.226 0-1パズル
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-11-13 05:20:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,584 bytes |
| コンパイル時間 | 980 ms |
| コンパイル使用メモリ | 92,612 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-13 14:33:36 |
| 合計ジャッジ時間 | 1,578 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 WA * 7 |
ソースコード
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <numeric>
#include <functional>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <sstream>
#include <string>
#define repd(i,a,b) for (int i=(a);i<(b);i++)
#define rep(i,n) repd(i,0,n)
#define var auto
#define mod 1000000007
#define inf 2147483647
#define nil -1
typedef long long ll;
using namespace std;
int input(){
int a;
cin >> a;
return a;
}
template <typename T>
void output(T a, int p) {
if(p){
cout << fixed << setprecision(p) << a << "\n";
}
else{
cout << a << "\n";
}
}
// end of template
int main() {
cin.tie(0);
// source code
int H = input();
int W = input();
vector<vector<int>> cell(H, vector<int> (W, -1));
rep(i, H){
rep(j, W){
char c;
cin >> c;
if (c == '0') cell[i][j] = 0;
if (c == '1') cell[i][j] = 1;
}
}
// 0101010101... or ...11..., ...00...
vector<int> dpc[2]; // judge if the cell of the first row must be 0 or 1
rep(i, 2){
dpc[i].resize(W, 0);
}
ll ret = 1;
rep(i, H){
rep(j, W){
if (cell[i][j] != -1) {
dpc[(i + cell[i][j]) % 2][j] = 1;
}
}
}
rep(i, W){
if (!dpc[0][i] && !dpc[1][i]) {
ret *= 2;
}
else if (dpc[0][i] && dpc[1][i]){
ret = 0;
}
ret %= mod;
}
bool is01 = true;
bool is10 = true;
if (ret) {
rep(i, W){
if (dpc[(i + 1) % 2][i]) {
is01 = false;
}
if (dpc[i % 2][i]) {
is10 = false;
}
}
}
vector<int> dpr[2];
rep(i, 2){
dpr[i].resize(H, 0);
}
rep(i, H){
rep(j, W){
if (cell[i][j] != -1) {
dpr[(j + cell[i][j]) % 2][i] = 1;
}
}
}
ll ret01 = (is01 && !dpr[1][0]) ? 1 : 0;
ll ret10 = (is10 && !dpr[0][0]) ? 1 : 0;
repd(i, 1, H){
if (!dpr[0][i] && !dpr[1][i]) {
ret01 *= 2;
ret10 *= 2;
ret01 %= mod;
ret10 %= mod;
}
else if(dpr[0][i] && dpr[1][i]){
ret01 = 0;
ret10 = 0;
}
}
ret = ret + (is01 ? ret01 - 1 : 0) + (is10 ? ret10 - 1 : 0);
ret %= mod;
output(ret, 0);
return 0;
}