結果
問題 |
No.3040 Aoiスコア
|
ユーザー |
|
提出日時 | 2025-02-28 22:21:31 |
言語 | JavaScript (node v23.5.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,769 bytes |
コンパイル時間 | 85 ms |
コンパイル使用メモリ | 7,972 KB |
実行使用メモリ | 60,744 KB |
最終ジャッジ日時 | 2025-06-20 20:58:53 |
合計ジャッジ時間 | 4,569 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 14 TLE * 1 -- * 11 |
ソースコード
const Mod = { mod: 998244353, memo: [], // Number型の範囲内での掛け算 mul: function(a, b) { a %= Mod.mod, b %= Mod.mod; const m = (...num) => num.reduce((a, b) => a * b % Mod.mod, 1); const x = 1 << 16; const a1 = a >> 16, a2 = a & (x - 1); const b1 = b >> 16, b2 = b & (x - 1); return (m(a1, b1, x, x) + m(a1 * b2 + b1 * a2, x) + m(a2, b2)) % Mod.mod; }, // 累乗(繰り返し二乗法) pow: function(a, n) { if (Mod.memo[n]) return Mod.memo[n]; if (n === 0) return Mod.memo[n] = 1; if (n === 1) { return Mod.memo[n] = a; } if (n % 2 === 1) { return Mod.memo[n] = Mod.mul(a, Mod.pow(a, n - 1)); } else { return Mod.memo[n] = Mod.pow(Mod.mul(a, a), n / 2); } }, // 逆元 inv: function(a) { return Mod.pow(a, Mod.mod - 2); }, // 割算 div: function(p, q) { return Mod.mul(p, Mod.inv(q)); } } function Main(input) { input = input.split("\n"); const [N, M] = input.shift().split(" ").map(Number); const S = input.shift().trim(); let Q = 0; for (let i = 0; i < N; i++) if (S[i] === "?") Q++; const AB = []; for (let i = 0; i < M; i++) { AB.push(input[i].split(" ").map(e => +e - 1)); } let ans = 0; const set = new Set(["aa", "ii", "oo", "ai", "ia"]); const cut = (a, b) => set.has(S[a] + S[b]); for (let i = 0; i < M; i++) { let [Ai, Bi] = AB[i]; if (cut(Ai, Bi)) continue; for (let j = i + 1; j < M; j++) { let [Aj, Bj] = AB[j]; if (cut(Aj, Bj)) continue; if (new Set([Ai, Aj, Bi, Bj]).size !== 3) continue; if (Ai === Aj) { [Ai, Bi] = [Bi, Ai]; } else if (Bi === Bj) { [Aj, Bj] = [Bj, Aj]; } else if (Ai === Bj) { [Ai, Bi] = [Bi, Ai]; [Aj, Bj] = [Bj, Aj]; } const [s, t, u] = [Ai, Bi, Bj]; const aoi = S[s] + S[t] + S[u]; const ioa = S[u] + S[t] + S[s]; function judge(str) { let rslt = 0; for (let i = 0; i < 3; i++) { if (str[i] === "?") { rslt++; } else if (str[i] !== "aoi"[i]) { rslt = -1; break; } } if (rslt >= 0) { ans += Mod.pow(26, Q - rslt); ans %= Mod.mod; } } judge(aoi); judge(ioa); } } console.log(ans); } Main(require("fs").readFileSync(0)+"")