結果
| 問題 | No.2926 Botaoshi |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-11-11 02:05:21 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,575 bytes |
| 記録 | |
| コンパイル時間 | 2,216 ms |
| コンパイル使用メモリ | 197,796 KB |
| 実行使用メモリ | 155,864 KB |
| 最終ジャッジ日時 | 2026-11-11 02:06:04 |
| 合計ジャッジ時間 | 25,536 ms |
|
ジャッジサーバーID (参考情報) |
judge4_0 / judge7_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 35 WA * 7 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
long long offset = 10;
map<long long, long long> dp;
long long mod = 998244353;
// Pythonの @lru_cache に相当するメモ化用配列
bool visited[4][4][200015];
long long cache_dfs[4][4][200015];
long long dfs(long long l, long long r, long long p) {
if (visited[l][r][p]) return cache_dfs[l][r][p];
if (p == 1) {
long long ret = 0;
if (l == 0 || l == 1) {
if (r == 0) ret = 2;
else if (r == 1) ret = 3;
else ret = 3;
} else {
if (r == 0) ret = 1;
else if (r == 1) ret = 2;
else ret = 2;
}
visited[l][r][p] = true;
cache_dfs[l][r][p] = ret;
return ret;
}
long long res = 0;
for (long long i = 0; i < 3; i++) {
bool ok = true;
if (l == 2 && i == 0) {
ok = false;
}
if (ok) {
res += dfs(i, r, p - 1);
res %= mod;
}
}
dp[p * offset * offset + l * offset + r] = res;
visited[l][r][p] = true;
cache_dfs[l][r][p] = res % mod;
return res % mod;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
if (!(cin >> N)) return 0;
string S_input;
cin >> S_input;
// S=list(map(str, input())) と insert/append の再現
vector<char> S;
S.push_back('U');
for (char c : S_input) {
S.push_back(c);
}
S.push_back('U');
dp[100] = 2;
dp[101] = 3;
dp[102] = 3;
dp[110] = 2;
dp[111] = 3;
dp[112] = 3;
dp[120] = 1;
dp[121] = 2;
dp[122] = 2;
dfs(0, 0, 200010);
dfs(0, 1, 200010);
dfs(0, 2, 200010);
long long ans = 1;
long long l = -1, r = -1;
long long idx = 0;
map<char, long long> d;
d['L'] = 0;
d['U'] = 1;
d['R'] = 2;
for (long long i=1; i<S.size(); i++){
if (S[idx-1]=='R' && S[idx]=='L'){
ans=0;
}
}
while (idx < S.size()) {
if (S[idx] == '.') {
l = d[S[idx - 1]];
long long p = 1;
idx += 1;
while (idx < S.size()) {
if (S[idx] == '.') {
p += 1;
idx += 1;
} else {
r = d[S[idx]];
break;
}
}
ans *= dp[p * offset * offset + l * offset + r];
ans %= mod;
} else {
idx += 1;
}
}
cout << ans % mod << "\n";
return 0;
}