ログインしてください。
提出 #57457717
ソースコード 拡げる
N = int(input())
S = input()
d = {"J": 1 << 2, "O": 1 << 1, "I": 1 << 0}
# dp[i][j] := i 列目まで見た時の集合が j の時の組み合わせ
dp = [[0]*(1 << 3) for _ in range(N + 1)]
dp[0][d["J"]] = 1
mod = 10007
for i in range(N):
# 今日の責任者
people = d[S[i]]
for last in range(1 << 3):
for now in range(1 << 3):
# 責任者は now に含まれなければいけない
if (now & people) == 0:
continue
# 昨日の参加者の中に最低でも1人は今日参加する人がいなければならない
if (last & now) == 0:
continue
dp[i + 1][now] += dp[i][last]
dp[i + 1][now] %= mod
# 答えを求める
ans = 0
for j in range(1 << 3):
ans += dp[N][j]
ans %= mod
print(ans)
提出情報
| 提出日時 | |
|---|---|
| 問題 | D - 部活のスケジュール表 (Schedule) |
| ユーザ | ryusuke_h |
| 言語 | Python (PyPy 3.10-v7.3.12) |
| 得点 | 100 |
| コード長 | 857 Byte |
| 結果 | AC |
| 実行時間 | 60 ms |
| メモリ | 81876 KiB |
ジャッジ結果
| セット名 | set01 | set02 | set03 | set04 | set05 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | ||||||||||
| 結果 |
|
|
|
|
|
| セット名 | テストケース |
|---|---|
| set01 | data1 |
| set02 | data2 |
| set03 | data3 |
| set04 | data4 |
| set05 | data5 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| data1 | AC | 55 ms | 76428 KiB |
| data2 | AC | 55 ms | 76656 KiB |
| data3 | AC | 59 ms | 81780 KiB |
| data4 | AC | 60 ms | 81876 KiB |
| data5 | AC | 60 ms | 81688 KiB |