Submission #54014177


Source Code Expand

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#define mems(x, v) memset(x, v, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;
typedef unsigned long long ull;
typedef long double wisdom;

struct Node {int nxt, val;} trans[15][2];
map <string, int> id; int dis[15];
void insert(string s, char ch, int val, string to) {trans[id[s]][ch == 'A' ? 0 : 1] = (Node){id[to], val};}
void tick(string s, int val) {dis[id[s]] = val;}

void prepare() {
	id["A"] = 0, id["B"] = 1,
	id["AA"] = 2, id["BB"] = 3,
	id["AAA"] = 4, id["BBB"] = 5,
	id["AAAA"] = 6, id["BBBB"] = 7, //AAAA: 当前在B且下一段A选择跳过
	id["AB"] = 8, id["BA"] = 9,
	id["O"] = 10, id["OA"] = 11, id["OB"] = 12;

	insert("A", 'A', 0, "AA"), insert("A", 'B', 0, "AB");
	insert("B", 'A', 0, "BA"), insert("B", 'B', 0, "BB");
	insert("AA", 'A', 0, "AAA"), insert("AA", 'B', 1, "AB");
	insert("BB", 'A', 1, "BA"), insert("BB", 'B', 0, "BBB");
	insert("AAA", 'A', 1, "AAAA"), insert("AAA", 'B', 2, "O");
	insert("BBB", 'A', 2, "O"), insert("BBB", 'B', 1, "BBBB");
	insert("AAAA", 'A', 0, "AAAA"), insert("AAAA", 'B', 1, "B");
	insert("BBBB", 'A', 1, "A"), insert("BBBB", 'B', 0, "BBBB");
	insert("AB", 'A', 1, "O"), insert("AB", 'B', 0, "BBBB");
	insert("BA", 'A', 0, "AAAA"), insert("BA", 'B', 1, "O");
	insert("O", 'A', 0, "OA"), insert("O", 'B', 0, "OB");
	insert("OA", 'A', 0, "AAAA"), insert("OA", 'B', 1, "O");
	insert("OB", 'A', 1, "O"), insert("OB", 'B', 0, "BBBB");

	tick("A", 1), tick("B", 1);
	tick("AA", 2), tick("BB", 2);
	tick("AAA", 2), tick("BBB", 2);
	tick("AAAA", 1), tick("BBBB", 1);
	tick("AB", 1), tick("BA", 1);
	tick("O", 1), tick("OA", 1), tick("OB", 1);
}

const int mod = 1e9 + 7;
int dp[4005][2005][15]; //dp[i][j][s]: 前i个点走了j步且当前状态为s,方案数

int main() {
	int n, k, ans = 0; string A;
	cin >> n >> k >> A, prepare();
	dp[0][0][id["O"]] = 1;
	for (int i = 0; i < n; i++)
		for (int j = 0; j <= k; j++) for (int s = 0; s <= 12; s++) {
			if (A[i] == '?' || A[i] == 'A') (dp[i + 1][j + trans[s][0].val][trans[s][0].nxt] += dp[i][j][s]) %= mod;
			if (A[i] == '?' || A[i] == 'B') (dp[i + 1][j + trans[s][1].val][trans[s][1].nxt] += dp[i][j][s]) %= mod;
		}
	for (int i = 0; i <= k; i++) for (int s = 0; s <= 12; s++)
		if (i + dis[s] <= k) ans = (ans + dp[n - 1][i][s]) % mod;
	cout << ans;
	return 0;
}

Submission Info

Submission Time
Task F - AtCoder Express 3
User liangbowen
Language C++ 20 (gcc 12.2)
Score 800
Code Size 2525 Byte
Status AC
Exec Time 659 ms
Memory 473256 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 4
AC × 20
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All corner_01.txt, corner_02.txt, corner_03.txt, corner_04.txt, corner_05.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
Case Name Status Exec Time Memory
corner_01.txt AC 1 ms 3692 KiB
corner_02.txt AC 1 ms 3532 KiB
corner_03.txt AC 1 ms 3684 KiB
corner_04.txt AC 1 ms 3508 KiB
corner_05.txt AC 1 ms 3696 KiB
in01.txt AC 11 ms 20372 KiB
in02.txt AC 10 ms 20104 KiB
in03.txt AC 23 ms 28104 KiB
in04.txt AC 160 ms 129060 KiB
in05.txt AC 659 ms 473256 KiB
in06.txt AC 286 ms 257628 KiB
in07.txt AC 391 ms 349932 KiB
in08.txt AC 259 ms 204492 KiB
in09.txt AC 517 ms 403168 KiB
in10.txt AC 426 ms 320744 KiB
in11.txt AC 281 ms 215080 KiB
sample_01.txt AC 1 ms 3620 KiB
sample_02.txt AC 1 ms 3684 KiB
sample_03.txt AC 1 ms 3596 KiB
sample_04.txt AC 1 ms 4128 KiB