Submission #31262839
Source Code Expand
MOD = 10007
n = int(input())
s = input()
dp = [[[[0] * 2 for i in range(2)] for j in range(2)] for k in range(n)]
# dp[i][j][k][l] = i 日目の J 君が j,O 君が k,I 君が l であるときの,i 日目までのスケジュールの組み方の場合の数
# ただし,j, k, l は 0 (不参加) または 1 (参加)
for k in range(2):
for l in range(2):
if s[0] == "O" and k == 0:
continue # O 君が責任者にもかかわらず不参加のスケジュールは除外
if s[0] == "I" and l == 0:
continue # I 君が責任者にもかかわらず不参加のスケジュールは除外
dp[0][1][k][l] = 1 # 初日は J 君が参加必須
for i in range(1, n):
for j in range(2):
for k in range(2):
for l in range(2):
if s[i] == "J" and j == 0:
continue # J 君が責任者にもかかわらず不参加のスケジュールは除外
if s[i] == "O" and k == 0:
continue # O 君が責任者にもかかわらず不参加のスケジュールは除外
if s[i] == "I" and l == 0:
continue # I 君が責任者にもかかわらず不参加のスケジュールは除外
for a in range(2):
for b in range(2):
for c in range(2):
if j * a + k * b + l * c == 0:
continue # 前日と共通の参加者が 1 人もいないスケジュールは鍵を開けられないので除外
dp[i][j][k][l] += dp[i - 1][a][b][c]
dp[i][j][k][l] %= MOD
answer = 0
for j in range(2):
for k in range(2):
for l in range(2):
answer += dp[n - 1][j][k][l]
answer %= MOD
print(answer)
Submission Info
| Submission Time | |
|---|---|
| Task | D - 部活のスケジュール表 (Schedule) |
| User | Pro_ktmr |
| Language | PyPy3 (7.3.0) |
| Score | 100 |
| Code Size | 1884 Byte |
| Status | AC |
| Exec Time | 96 ms |
| Memory | 74716 KiB |
Judge Result
| Set Name | set01 | set02 | set03 | set04 | set05 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | 20 / 20 | ||||||||||
| Status |
|
|
|
|
|
| Set Name | Test Cases |
|---|---|
| set01 | data1 |
| set02 | data2 |
| set03 | data3 |
| set04 | data4 |
| set05 | data5 |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| data1 | AC | 67 ms | 61752 KiB |
| data2 | AC | 54 ms | 61900 KiB |
| data3 | AC | 87 ms | 74164 KiB |
| data4 | AC | 96 ms | 74716 KiB |
| data5 | AC | 91 ms | 74652 KiB |