結果
| 問題 |
No.1677 mæx
|
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2021-09-10 22:35:20 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 2,000 ms |
| コード長 | 1,983 bytes |
| コンパイル時間 | 260 ms |
| コンパイル使用メモリ | 32,256 KB |
| 実行使用メモリ | 9,216 KB |
| 最終ジャッジ日時 | 2024-06-12 01:33:29 |
| 合計ジャッジ時間 | 1,077 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 18 |
ソースコード
#include <stdio.h>
const int Mod = 998244353;
int main()
{
char S[200001];
int K;
scanf("%s", S);
scanf("%d", &K);
if (S[1] == 0) {
if (S[0] == '?') printf("3\n");
else if (S[0] - '0' == K) printf("1\n");
else printf("0\n");
fflush(stdout);
return 0;
}
int i, j, k, par[200001], s[200001], head = 1;
s[0] = -1;
for (i = 0; S[i] != 0; i++) {
if (S[i] == ',' || S[i] == ')') par[i] = -2;
else {
par[i] = s[--head];
if (S[i] == 'm') {
s[head++] = i;
s[head++] = i;
par[i+1] = -2;
par[i+2] = -2;
par[i+3] = -2;
i += 3;
}
}
}
int child[200001][2] = {};
long long dp[200001][3] = {};
for (i = 0; S[i] != 0; i++) {
if (par[i] < 0) continue;
else if (child[par[i]][1] == 0) child[par[i]][1] = i;
else child[par[i]][0] = i;
}
for (i--; i >= 0; i--) {
if (par[i] == -2) continue;
if (child[i][0] == 0) {
if (S[i] == '?') {
dp[i][0] = 1;
dp[i][1] = 1;
dp[i][2] = 1;
} else dp[i][S[i] - '0'] = 1;
} else {
j = child[i][0];
k = child[i][1];
if (S[i+1] == '?') {
dp[i][0] = (dp[j][0] * dp[k][0] + (dp[j][1] + dp[j][2]) * (dp[k][1] + dp[k][2])) % Mod;
dp[i][1] = (dp[j][1] * (dp[k][0] + dp[k][1]) + dp[k][1] * dp[j][0] + dp[j][0] * (dp[k][0] + dp[k][2]) + dp[k][0] * dp[j][2]) % Mod;
dp[i][2] = (dp[j][2] * (dp[k][0] + dp[k][1] + dp[k][2]) + dp[k][2] * (dp[j][0] + dp[j][1]) + dp[j][0] * dp[k][1] + dp[k][0] * dp[j][1]) % Mod;
} else if (S[i+1] == 'a') {
dp[i][0] = dp[j][0] * dp[k][0] % Mod;
dp[i][1] = (dp[j][1] * (dp[k][0] + dp[k][1]) + dp[k][1] * dp[j][0]) % Mod;
dp[i][2] = (dp[j][2] * (dp[k][0] + dp[k][1] + dp[k][2]) + dp[k][2] * (dp[j][0] + dp[j][1])) % Mod;
} else {
dp[i][0] = (dp[j][1] + dp[j][2]) * (dp[k][1] + dp[k][2]) % Mod;
dp[i][1] = (dp[j][0] * (dp[k][0] + dp[k][2]) + dp[k][0] * dp[j][2]) % Mod;
dp[i][2] = (dp[j][0] * dp[k][1] + dp[k][0] * dp[j][1]) % Mod;
}
}
}
printf("%lld\n", dp[0][K]);
fflush(stdout);
return 0;
}