結果
問題 | No.563 超高速一人かるた large |
ユーザー | rpy3cpp |
提出日時 | 2017-08-26 01:39:48 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,760 bytes |
コンパイル時間 | 250 ms |
コンパイル使用メモリ | 81,792 KB |
実行使用メモリ | 154,240 KB |
最終ジャッジ日時 | 2024-10-15 16:24:13 |
合計ジャッジ時間 | 11,294 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 92 ms
94,976 KB |
testcase_01 | AC | 94 ms
89,600 KB |
testcase_02 | AC | 90 ms
89,472 KB |
testcase_03 | AC | 156 ms
109,440 KB |
testcase_04 | AC | 185 ms
109,568 KB |
testcase_05 | AC | 221 ms
109,696 KB |
testcase_06 | AC | 940 ms
116,992 KB |
testcase_07 | AC | 1,391 ms
120,064 KB |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
ソースコード
import collections MAXN = 2001 mod = 10**9 + 7 fac = [1] for k in range(1, MAXN): fac.append(fac[-1] * k % mod) nCr_memo = [[0] * MAXN for _ in range(MAXN)] nCr_memo[0][0] = 1 for n in range(1, MAXN): nCr_memo[n][0] = 1 nCr_memo[n][n] = 1 for r in range(1, n): nCr_memo[n][r] = (nCr_memo[n - 1][r - 1] + nCr_memo[n - 1][r]) % mod def nCr(n, r): if r < 0: return 0 return nCr_memo[n][r] def read_data(): N = int(input()) Ss = [input() for i in range(N)] return N, Ss def common_prefix(S1, S2): for i in range(min(len(S1), len(S2))): if S1[i] != S2[i]: return i return min(len(S1), len(S2)) def preprocess(N, Ss): Ss.sort() mat = [[0] * N for _ in range(N)] for i in range(N): for j in range(i + 1, N): mat[i][j] = common_prefix(Ss[i], Ss[j]) + 1 mat[j][i] = mat[i][j] return mat def preprocess2(N, mat): fs = [] for i in range(N): counter = collections.Counter(mat[i]) lst = list(counter.items()) lst.sort() fL = 0 fH = N - 1 data = [] for j, fj in lst[1:]: fH -= fj data.append((j, fj, fL, fH)) fL += fj fs.append(data) return fs def solve(N, Ss): mat = preprocess(N, Ss) fs = preprocess2(N, mat) ans = [0] for k in range(N - 1): cum = (ans[-1] * (N - k)) % mod for f in fs: for j, fj, fL, fH in f: cum = (cum + j * (nCr(fL + fj, k - fH) - nCr(fL, k - fH - fj)) * fac[k]) % mod ans.append(cum) cum = (ans[-1] + fac[N]) % mod ans.append(cum) return ans N, Ss = read_data() ans = solve(N, Ss) for a in ans[1:]: print(a)