結果
問題 | No.563 超高速一人かるた large |
ユーザー |
|
提出日時 | 2017-08-26 01:38:25 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,760 bytes |
コンパイル時間 | 85 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 118,144 KB |
最終ジャッジ日時 | 2024-10-15 16:23:59 |
合計ジャッジ時間 | 13,435 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 3 TLE * 1 -- * 14 |
ソースコード
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)