QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#679642#7900. Gifts from KnowledgeRapidsWA 0ms3552kbC++203.3kb2024-10-26 18:00:492024-10-26 18:00:53

Judging History

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

  • [2024-10-26 18:00:53]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3552kb
  • [2024-10-26 18:00:49]
  • 提交

answer

/*
    @file             G.cpp
    @author           1
    @date             2024-10-25 15:31
*/
#include <bits/stdc++.h>

using namespace std;
#define all(a) a.begin(), a.end()
#define pb push_back
#define eb emplace_back
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define endl '\n'

void print() { cout << '\n'; }

template<typename T, typename...Args>
void print(T t, Args...args) {
    cout << t << ' ';
    print(args...);
}

using pii = pair<int, int>;
using ll = long long;
using pll = pair<ll, ll>;
const int N = 2e5 + 10;
const int mod = 1000000000 + 7;
const ll MAX = 1e18;
// function

template<typename T>
void chmax(T &x, T y) { x = max(x, y); }

template<typename T>
void chmin(T &x, T y) { x = min(x, y); }

template<typename T = int>
vector<T> readVector(int n) {
    vector<T> a(n);
    for (T &x: a) cin >> x;
    return a;
}

void solve() {
    int r, c;
    cin >> r >> c;
    string s[r];
    for (int i = 0; i < r; ++i)
        cin >> s[i];
    //c = (int) s[0].size();
    for (int j = 0; j <= c / 2; ++j) {
        int cnt = 0;
        for (int i = 0; i < r; ++i) {
            cnt += s[i][j] == '1';
            if (j != c - j - 1) {
                cnt += s[i][c - j - 1] == '1';
            }
        }
        if (cnt > 2) {
            std::cout << 0 << '\n';
            return;
        }
    }


    vector<bool> bl(r);
    for (int j = 0; j < c; ++j) {
        bool b = true;
        int x = -1;
        for (int i = 0; i < r; ++i) {
            if (s[i][j] == '1') {
                if (b) {
                    b = false;
                    x = i;
                }
                else {
                    if (!bl[i]) {
                        reverse(all(s[i]));
                        bl[i] = true;
                    } else {
                        reverse(all(s[x]));
                        bl[x] = true;
                    }
                    break;
                }
            }
        }
    }


    /*for (int i = 0; i < r; ++i)
        cout << s[i] << endl;*/

    int p[r + 1];
// p 寻找根节点,size 求数组包含的元素,仅根节点有效
    for (int i = 1; i <= r; ++i)
        p[i] = i; // 一开始各自在自己的集合

    function<int(int)> find = [&](int x) {
        if (p[x] != x)
            p[x] = find(p[x]);
        return p[x];
    };

    auto insert = [&](int x, int y) {
        if (find(x) != find(y))
            p[find(y)] = find(x);
    };

    for (int j = 0; j < c / 2; ++j) {
        vector<int> d;
        for (int i = 0; i < r; ++i) {
            if (s[i][j] == '1')
                d.pb(i + 1);
            if (s[i][c - j - 1] == '1')
                d.pb(i + 1);
        }
        for (int i = 1; i < d.size(); ++i)
            insert(d[i], d[i - 1]);
    }
    set<int> st;
    for (int i = 1; i <= r; ++i)
        st.insert(find(i));
    ll ans = 1;
    for (int i = 0; i < st.size(); ++i) {
        ans = (ans * 2) % mod;
        //cout << ans << ' ';
    }
    //cout << num << ' ';
    cout << ans << endl;
}

int main() {
    IOS;
    int t = 1;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
/*
000000000001000
010000000000001
010100001000100
 */

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3552kb

input:

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

output:

4
4
2

result:

wrong answer 2nd numbers differ - expected: '0', found: '4'