Submission #64595245


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a) - 1; i >= (b); i--)
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second

typedef long long LL;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef double db;

const int mod = 998244353;

int add(int a, int b)
{
	return a + b < mod ? a + b : a + b - mod;
}

void updAdd(int& a, int b)
{
	a += b;
	if (a >= mod)
		a -= mod;
}

int sub(int a, int b)
{
	return a - b >= 0 ? a - b : a - b + mod;
}

void updSub(int& a, int b)
{
	a -= b;
	if (a < 0)
		a += mod;
}

int mult(int a, int b)
{
	return (LL)a * b % mod;
}

int binpow(int a, LL n)
{
	int res = 1;
	while (n)
	{
		if (n & 1)
			res = mult(res, a);
		a = mult(a, a);
		n /= 2;
	}
	return res;
}

template<typename T>
void updMin(T& a, T b)
{
	a = min(a, b);
}

template<typename T>
void updMax(T& a, T b)
{
	a = max(a, b);
}

struct DSU
{
	int n;
	VI p, sz;
	
	DSU(int _n = 0) 
	{
		n = _n;
		p.resize(n);
		iota(ALL(p), 0);
		sz.assign(n, 1);
	}
	int find(int v)
	{
		if (v == p[v])
			return v;
		return p[v] = find(p[v]);
	}
	bool unite(int u, int v)
	{
		u = find(u);
		v = find(v);
		if (u == v) 
			return false;
		if (sz[u] > sz[v])
			swap(u, v);
		p[u] = v;
		sz[v] += sz[u];
		return true;
	}
};

const int N = 1 << 20;

vector<PII> g[N];
int col[N];
bool ok;

void addEdge(int u, int v, int c)
{
	g[u].PB({v, c});
	g[v].PB({u, c});
}

void dfs(int v)
{
	for (auto [to, w] : g[v])
	{
		if (col[to] == -1)
		{
			col[to] = col[v] ^ w;
			dfs(to);
		}
		ok &= col[to] == (col[v] ^ w);
	}
}

void solve()
{
	int h, w;
	cin >> h >> w;
	vector<string> s(h);
	for (string& si : s)
		cin >> si;
	FOR(i, 0, h * w)
	{
		g[i].clear();
		col[i] = -1;
	}
	ok = true;
	FOR(i, 0, h)
	{
		int f = -1, prv = -1;
		FOR(j, 0, w)
		{
			if (s[i][j] == 'A')
				continue;
			if (prv != -1)
			{
				addEdge(w * i + j, w * i + prv, (j - prv - 1) % 2);
			}
			prv = j;
			if (f == -1)
				f = j;
		}
		if (f != -1)
		{
			addEdge(w * i + prv, w * i + f, (w - prv + f - 1) % 2);
		}
	}
	FOR(j, 0, w)
	{
		int f = -1, prv = -1;
		FOR(i, 0, h)
		{
			if (s[i][j] == 'A')
				continue;
			if (prv != -1)
			{
				addEdge(w * i + j, w * prv + j, (i - prv - 1) % 2);
			}
			prv = i;
			if (f == -1)
				f = i;
		}
		if (f != -1)
		{
			addEdge(w * prv + j, w * f + j, (h - prv + f - 1) % 2);
		}
	}
	FOR(i, 0, h * w)
	{
		if (col[i] == -1)
		{
			col[i] = 0;
			dfs(i);
		}
	}
	if (!ok)
	{
		cout << "0\n";
		return;
	}
	DSU dsu(h + w);
	FOR(i, 0, h)
	{
		FOR(j, 0, w)
		{
			if (s[i][j] == 'B')
			{
				dsu.unite(i, h + j);
			}
		}
	}
	int ans = 1;
	FOR(i, 0, h + w)
	{
		if (dsu.find(i) == i)
		{
			ans = mult(ans, 2);
		}
	}
	cout << ans << "\n";
}

int main()
{
	ios::sync_with_stdio(0); 
	cin.tie(0);
	int t;
	cin >> t;
	while (t--)
		solve();
	return 0;
}

Submission Info

Submission Time
Task B - Torus Loop
User mshcherba
Language C++ 20 (gcc 12.2)
Score 0
Code Size 3211 Byte
Status WA
Exec Time 167 ms
Memory 104752 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 700
Status
AC × 1
AC × 33
WA × 4
Set Name Test Cases
Sample example_00.txt
All example_00.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt
Case Name Status Exec Time Memory
example_00.txt AC 5 ms 3372 KiB
test_00.txt WA 43 ms 3500 KiB
test_01.txt WA 45 ms 3588 KiB
test_02.txt AC 44 ms 3452 KiB
test_03.txt WA 46 ms 3520 KiB
test_04.txt WA 42 ms 3448 KiB
test_05.txt AC 40 ms 3496 KiB
test_06.txt AC 118 ms 90152 KiB
test_07.txt AC 116 ms 86280 KiB
test_08.txt AC 134 ms 104752 KiB
test_09.txt AC 130 ms 88384 KiB
test_10.txt AC 167 ms 82780 KiB
test_11.txt AC 119 ms 63944 KiB
test_12.txt AC 42 ms 27440 KiB
test_13.txt AC 12 ms 8384 KiB
test_14.txt AC 14 ms 12408 KiB
test_15.txt AC 32 ms 28980 KiB
test_16.txt AC 39 ms 33504 KiB
test_17.txt AC 38 ms 32416 KiB
test_18.txt AC 41 ms 35288 KiB
test_19.txt AC 39 ms 35980 KiB
test_20.txt AC 44 ms 35004 KiB
test_21.txt AC 39 ms 33236 KiB
test_22.txt AC 35 ms 32052 KiB
test_23.txt AC 37 ms 31960 KiB
test_24.txt AC 32 ms 29476 KiB
test_25.txt AC 30 ms 25492 KiB
test_26.txt AC 35 ms 30104 KiB
test_27.txt AC 42 ms 36876 KiB
test_28.txt AC 37 ms 31052 KiB
test_29.txt AC 31 ms 25276 KiB
test_30.txt AC 30 ms 27564 KiB
test_31.txt AC 31 ms 26708 KiB
test_32.txt AC 29 ms 28428 KiB
test_33.txt AC 35 ms 30988 KiB
test_34.txt AC 42 ms 34636 KiB
test_35.txt AC 22 ms 20468 KiB