QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#511164#7789. Outro: True Love WaitsMCdycWA 4ms19468kbC++201.9kb2024-08-09 17:03:412024-08-09 17:03:41

Judging History

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

  • [2024-08-09 17:03:41]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:19468kb
  • [2024-08-09 17:03:41]
  • 提交

answer

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

const i64 mod = 1e9 + 7;
const int MAXN = 1e6 + 5;
using bs = bitset<MAXN>;

vector<int> mp({ 0, 1, 3, 2 });

int f[MAXN][4];


void init() {

    for (int i = 1; i <= 1000000; i++) {
        f[i][1] = f[i - 1][1] * 4 + 1;
        f[i][1] %= mod;
        f[i][2] = f[i - 1][1] * 4 + 3;
        f[i][2] %= mod;
        f[i][3] = f[i - 1][1] * 4 + 2;
        f[i][3] %= mod;
    }

}

i64 kpow(i64 x, i64 y) {
    i64 res = 1ll;
    while (y) {
        if (y & 1)
            res = res * x % mod;
        x = x * x % mod;
        y >>= 1;
    }
    return res;
}

const i64 inv3 = kpow(3, mod - 2);

void solve() {
    string s, t;
    i64 k;
    cin >> s >> t >> k;
    bs ss(s), tt(t);
    ss ^= tt;
    // for (int i = 0; i < 10; i++)
    //     cerr << ss[i];
    // cerr << endl;

    int n = (max(s.length(), t.length()) + 1) >> 1;

    vector <int> four(0);
    // cerr << n << endl;
    for (int i = 0; i < n; i++)
        four.emplace_back(ss[i * 2] + ss[i * 2 + 1] * 2);

    n = four.size();
    i64 ans = 0;
    for (int i = 0; i < n; i++)
        if (four[i])
            ans += f[i][four[i]];

    i64 cnt = 0;
    int w = 0;
    while (four[w++] == 0) {
        cnt++;

    }

    if (ss.none()) {
        k--;
        cout << ((kpow(4ll, k + 1) - 4ll + mod) % mod * inv3 % mod) % mod << endl;
        return;
    }

    if (cnt + 1 < k) {
        cout << "-1\n";
        return;
    }

    if (s != t)
        k--;
    ans = (ans + (kpow(4ll, k + 1) - 4ll + mod) % mod * inv3 % mod) % mod;

    cout << ans << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    f[0][0] = 0;
    f[0][1] = 1;
    f[0][2] = 3;
    f[0][3] = 2;
    init();
    int t = 1;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

詳細信息

Test #1:

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

input:

4
1 10 1
1 10 2
100 0 2
11 11 3

output:

2
-1
9
20

result:

ok 4 number(s): "2 -1 9 20"

Test #2:

score: 0
Accepted
time: 0ms
memory: 19468kb

input:

1
0 0 1

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: -100
Wrong Answer
time: 3ms
memory: 19396kb

input:

100
110111 11111 1
10110 101101 1
11010 111111 1
100110 1 1
10010 11010 1
1100 10111 1
100100 111110 1
101110 101100 1
1011 10110 1
110100 1110 1
11010 11000 1
11110 1000 1
111000 11101 1
110 1001 1
101010 11000 1
10 111110 1
110001 101000 1
1010 1000 1
10101 11 1
111011 11010 1
110001 100000 1
1100...

output:

30
31
29
30
7
30
31
3
28
32
3
29
29
8
25
28
29
3
29
24
22
31
30
29
25
27
29
32
30
10
29
9
33
7
23
30
29
28
10
23
29
22
29
30
6
0
23
3
29
7
6
8
32
24
29
31
31
9
23
27
21
30
23
28
21
27
7
24
22
3
29
31
31
29
31
31
29
28
29
30
31
8
30
27
24
10
31
32
8
26
24
30
28
6
8
29
2
28
22
24

result:

wrong answer 1st numbers differ - expected: '78', found: '30'