QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#723453#9463. 基础 ABC 练习题hhoppitree0 0ms0kbC++172.6kb2024-11-07 22:20:272024-11-07 22:20:27

Judging History

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

  • [2024-11-07 22:20:27]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:0kb
  • [2024-11-07 22:20:27]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

const int N = 65;

unsigned int f[2][N][N][4];

signed main() {
    int T; scanf("%d%*d", &T);
    while (T--) {
        int n; scanf("%d", &n);
        string S1, S2; cin >> S1 >> S2;
        vector<int> o1, o2;
        for (int i = 0; i <= n; ++i) {
            if (S1[i] == '1') o1.push_back(i);
            if (S2[i] == '1') o2.push_back(i);
        }
        string S; cin >> S, S = ' ' + S;
//        if (n != 60) {
//            puts("-1");
//            continue;
//        }
        unsigned int res = 0;
        for (int i = 0; i < (int)o1.size(); ++i) {
            for (int j = 0; j < (int)o2.size(); ++j) {
                int l1 = (!i ? 0 : o1[i - 1] + 1), r1 = o1[i],
                    l2 = (!j ? 0 : o2[j - 1] + 1), r2 = o2[j], r3 = n - r1 - r2;
                if (r3 < 0) continue;
                memset(f[0], 0, sizeof(f[0]));
                f[0][0][0][(!l1) | ((!l2) << 1)] = 1;
                for (int k = 1; k <= n * 3; ++k) {
                    memset(f[k & 1], 0, sizeof(f[k & 1]));
                    for (int p = 0; p < k && p <= n; ++p) {
                        for (int q = 0; p + q <= k && q <= n && q - p <= r2; ++q) {
                            unsigned int *tg = f[(k & 1) ^ 1][p][q];
                            int r = k - 1 - p - q;
                            if (r < 0 || r > n || r - q > r3 || p - r > r1) continue;
                            if ((S[k] == '?' || S[k] == 'A') && p - r + 1 <= r1) {
                                unsigned int *tf = f[k & 1][p + 1][q];
                                if (p - r + 1 >= l1) tf[1] += tg[0] + tg[1], tf[3] += tg[2] + tg[3];
                                else tf[0] += tg[0], tf[1] += tg[1], tf[2] += tg[2], tf[3] += tg[3];
                            }
                            if ((S[k] == '?' || S[k] == 'B') && q - p + 1 <= r2) {
                                unsigned int *tf = f[k & 1][p][q + 1];
                                if (q - p + 1 >= l2) tf[2] += tg[0] + tg[2], tf[3] += tg[1] + tg[3];
                                else tf[0] += tg[0], tf[1] += tg[1], tf[2] += tg[2], tf[3] += tg[3];
                            }
                            if ((S[k] == '?' || S[k] == 'C') && r - q + 1 <= r3) {
                                unsigned int *tf = f[k & 1][p][q];
                                tf[0] += tg[0], tf[1] += tg[1], tf[2] += tg[2], tf[3] += tg[3];
                            }
                        }
                    }
                }
                res += f[n & 1][n][n][3];
            }
        }
        printf("%u\n", res);
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Time Limit Exceeded

Test #1:

score: 0
Time Limit Exceeded

input:

60 1
1
11
11
ABC
2
111
111
CABABC
3
1111
1111
CAABBCBAC
4
11111
11111
BACBBACBACAC
5
111111
111111
CABCCBBAABCCBAA
6
1111111
1111111
ABABABCACBCBCCACBA
7
11111111
11111111
BCAABACBBCBBABCCAACAC
8
111111111
111111111
CCBCBBBCAABCBCAAAAACBCBA
9
1111111111
1111111111
CCCCACABCBABAABCCAABABBCBBA
10
1111...

output:

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

result:


Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Time Limit Exceeded

Test #22:

score: 0
Time Limit Exceeded

input:

60 3
1
11
11
???
2
111
111
??????
3
1111
1111
?????????
4
11111
11111
????????????
5
111111
111111
???????????????
6
1111111
1111111
??????????????????
7
11111111
11111111
?????????????????????
8
111111111
111111111
????????????????????????
9
1111111111
1111111111
???????????????????????????
10
1111...

output:

3
48
1077
25950
631596
15361200
373543344
513491674
3715046604
2905885740
1568880512
2580218992
1190440544
717460800
3773052672
4125163354
1253250684
451796724
588301280
3790101036
1976168152
2307984512
3414639104
4155978864
3748854816
300437408
2740636160
342373696
3437770880
3706226944
2582641664
...

result:


Subtask #4:

score: 0
Skipped

Dependency #1:

0%

Subtask #5:

score: 0
Skipped

Dependency #1:

0%