QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#706444#7900. Gifts from Knowledgeq1w2e3r4#WA 41ms35392kbC++142.3kb2024-11-03 11:22:412024-11-03 11:22:41

Judging History

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

  • [2024-11-03 11:22:41]
  • 评测
  • 测评结果:WA
  • 用时:41ms
  • 内存:35392kb
  • [2024-11-03 11:22:41]
  • 提交

answer

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

int T,n,m;
string s[1000005]; 
const int MOD = 1e9 + 7;
struct Dsu{
    int f[2000005];
    void init(int n){
        for(int i=1;i<=n;i++) f[i] = i;
    }

    int find(int x){
        if(f[x] == x) return x;
        return f[x] = find(f[x]);
    }

    void uni(int x, int y){
        x = find(x),y = find(y);
        if(x == y) return;
        f[x] = y;
    }
}dsu;

void solve(){
    dsu.init(2*n); 
    for(int c=0;c<m/2;c++){
        vector<int> v1,v2,v3;
        int ci = m - c - 1;
        for(int r=1;r<=n;r++){
            if(s[r][c] == '0' && s[r][ci] == '1'){
                v1.push_back(r);
            }
            else if(s[r][c] == '1' && s[r][ci] == '0'){
                v2.push_back(r);
            }
            else if(s[r][c] == '1' && s[r][ci] == '1'){
                v3.push_back(r);
            }
        }

        if(v1.size() + v2.size() + v3.size() > 2){
            cout << 0 << endl;
            return;
        }

        if(v1.size() + v2.size() + v3.size() <= 1) continue;
        if(v3.size() == 1 && (v1.size() || v2.size())){
            cout << 0 << endl;
            return;
        }

        if(v1.size() == 2){
            int x = v1[0], y = v1[1];
            dsu.uni(x, y);
            dsu.uni(x+n, y+n);
        }
        else if(v2.size() == 2){
            int x = v2[0], y = v2[1];
            dsu.uni(x, y);
            dsu.uni(x+n, y+n);
        }
        else{
            int x = v1[0], y = v2[0];
            dsu.uni(x, y+n);
            dsu.uni(y, x+n);
        }
    }

    if(m % 2 == 1){
        int c = m / 2;
        int cnt = 0;
        for(int i=1;i<=n;i++){
            if(s[i][c] == '1'){
                cnt ++;
            }
        }
        if(cnt > 1){
            cout << 0 << endl;
            return;
        }
    }

    int ans = 0;
    for(int i=1;i<=2*n;i++){
        if(dsu.find(i) == i){
            ans ++;
        }
    }

    ans /= 2;
    int ret = 1;
    for(int i=1;i<=ans;i++){
        ret = ret * 2 % MOD;
    }
    cout << ret << endl;
}

int main(){
    cin >> T;
    while(T--){
        cin >> n >> m;
        for(int i=1;i<=n;i++){
            cin >> s[i];
        }

        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 35392kb

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: 41ms
memory: 35176kb

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: 35ms
memory: 35272kb

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 2380th numbers differ - expected: '0', found: '2'