結果
| 問題 | No.295 hel__world | 
| コンテスト | |
| ユーザー |  maspy | 
| 提出日時 | 2020-05-04 13:40:19 | 
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,880 bytes | 
| コンパイル時間 | 221 ms | 
| コンパイル使用メモリ | 12,928 KB | 
| 実行使用メモリ | 30,460 KB | 
| 最終ジャッジ日時 | 2024-06-24 07:51:08 | 
| 合計ジャッジ時間 | 6,728 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 25 WA * 4 RE * 24 | 
ソースコード
import sys
from functools import lru_cache
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines
INF = 2 ** 62
S = tuple(map(int, readline().split()))
T = tuple(x - ord('a') for x in read().rstrip())
L = [[] for _ in range(26)]
last_ch = -1
last_len = 0
for x in T:
    if x != last_ch:
        L[x].append(1)
    else:
        L[x][-1] += 1
    last_ch = x
def check_zero(S, L):
    for a in range(26):
        # if S[a] > 0 and (not L[a]):
        #     return True
        if S[a] < sum(L[a]):
            return True
if check_zero(S, L):
    print(0)
@lru_cache(None)
def comb(n, k):
    if k < 0 or k > n:
        return 0
    k = min(k, n-k)
    x = 1
    for i in range(k):
        x *= (n - i)
        x //= (i + 1)
        if x >= INF:
            return INF
    return x
def compute(n, nums):
    if not nums:
        return 1
    n -= sum(nums)
    if not n:
        return 1
    nums.sort(reverse=True)
    nums = nums[:70]
    if sum(nums) >= 6 and n > 10 ** 4:
        return INF
    if n <= 10 ** 4:
        A = nums[:]
        for _ in range(n):
            # 1 増やすと美味しいところを増やす
            i = max(range(len(nums)), key=lambda i: (A[i]+1) / (A[i] - nums[i] + 1))
            A[i] += 1
        x = 1
        for a, k in zip(A, nums):
            x *= comb(a,k)
        return x
    # n が大きくて、kは2種類
    # 基本的には、同じくらいの大きさにすればよいので
    ret = 1
    avg = n // len(nums)
    for p in itertools.product(range(avg - 4, avg + 5), repeat=len(nums)):
        if sum(avg) != n:
            continue
        x = 1
        for a, k in zip(p, nums):
            x *= comb(a,k)
        if ret < x:
            ret = x
    return ret
x = 1
for n, nums in zip(S, L):
    x *= compute(n, nums)
if x >= INF:
    x = 'hel'
print(x)
            
            
            
        