QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#779820#7900. Gifts from KnowledgezaqmjuWA 12ms3840kbC++232.0kb2024-11-24 22:00:022024-11-24 22:00:02

Judging History

你现在查看的是最新测评结果

  • [2024-11-24 22:00:02]
  • 评测
  • 测评结果:WA
  • 用时:12ms
  • 内存:3840kb
  • [2024-11-24 22:00:02]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'

struct DSU{
    vector<int>p;
    DSU(int n):p(n+1){iota(p.begin(),p.end(),0);}
    int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
    bool same(int x,int y){return find(x)==find(y);}
    void merge(int x,int y){
        x=find(x);
        y=find(y);
        if(x==y)return;
        p[y]=x;
        return;
    }
};
const int mod = 1e9 + 7;
int qpow(int a, int b) {
	int ans = 1;
	while(b) {
		if(b & 1)ans = ans * a % mod;
		b >>= 1;
		a = a * a % mod;
	}
	return ans;
}

void solve() {
	int n, m;
	cin >> n >> m;
	vector<string> s(n + 1);
	for(int i = 1; i <= n; i++) {
		cin >> s[i];
		s[i] = " " + s[i];
	}
	DSU d(2 * n);
	for(int j = 1; j <= m; j++) {
		int cnt = 0;
		vector<int> p;
		for(int i = 1; i <= n; i++) {
			if(s[i][j] == '1'){
				cnt++;
				p.push_back(i);
			}
			if(m - j + 1 != j && s[i][m - j + 1] == '1'){
				cnt++;
				p.push_back(i);
			}
		}
		if(cnt > 2) {
			cout << 0 << endl;
			return;
		}
		if(cnt == 2 && m == 1) {
			cout << 0 << endl;
			return;
		}
		// if(j == 3) cout << cnt << endl;
		if(cnt == 2) {
			int a = p[0], b = p[1];
			// if(j == 3)cout << a << " " << b << endl;
			if(a == b) {
				continue;
			}
			else if(s[a][j] == s[b][j]) {//同边
				// cout << 1 << endl;
				d.merge(a, b + n);
				d.merge(b, a + n);
			}
			else if(s[a][m - j + 1] == s[b][m - j + 1]) {
				d.merge(a, b + n);
				d.merge(b, a + n);
			}
			else {//不同边
				d.merge(a, b);
				d.merge(a + n, b + n);
			}
		}
	}
	int ans = 0;
	vector<int>vis(2 * n + 1);
	for(int i = 1; i <= n; i++) {
		if(d.find(i) == d.find(i + n)) {
			cout << 0 << endl;
			return;
		}
	}
	for(int i = 1; i <= 2 * n; i++) {
		int t = d.find(i);
		if(vis[t])continue;
		ans++;
		vis[t] = 1;
	}
	ans /= 2;
	cout << qpow(2, ans) << endl;
}

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3840kb

input:

3
3 5
01100
10001
00010
2 1
1
1
2 3
001
001

output:

4
0
2

result:

ok 3 number(s): "4 0 2"

Test #2:

score: 0
Accepted
time: 10ms
memory: 3660kb

input:

15613
10 10
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
15 8
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
1 5
00000
5 9
000000000
000000000
0000...

output:

1024
32768
2
32
32768
128
32
16
16
2
16384
16384
128
128
32768
8192
128
64
16384
2
4
2
4096
16
4096
1024
32768
32768
16384
8
128
2
16
4096
8192
32768
8192
8192
16
16384
16384
256
128
8
256
8
4096
512
2
4
32
32
2
64
512
1024
32768
32768
2
64
16384
16
8192
16
256
16
64
8192
8192
64
1024
2
32768
2
4
51...

result:

ok 15613 numbers

Test #3:

score: -100
Wrong Answer
time: 12ms
memory: 3564kb

input:

15759
9 6
000000
000000
000000
000000
000000
000000
000000
000000
000000
5 15
010000000000000
000000000000000
000000000000000
000100000000000
000100000000000
14 12
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000...

output:

512
16
16384
512
1024
4096
32768
4
2
512
512
512
512
8
2
256
16
4096
512
64
16
4096
512
32
32768
8192
32
2048
128
16
4096
64
32768
256
32
16384
8
512
32
2048
8
16
1024
2048
128
64
32
8
512
8
8192
256
8192
32768
2
8
512
512
256
32
2
2048
8192
8
64
8
2
16384
32768
32768
1024
4096
16384
16384
128
256
4...

result:

wrong answer 163rd numbers differ - expected: '0', found: '128'