結果
| 問題 | No.3626 Not a Prefix |
| コンテスト | |
| ユーザー |
回転
|
| 提出日時 | 2026-08-14 23:27:50 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,331 bytes |
| 記録 | |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 95,716 KB |
| 実行使用メモリ | 755,972 KB |
| 最終ジャッジ日時 | 2026-08-14 23:28:20 |
| 合計ジャッジ時間 | 26,538 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 43 TLE * 2 |
ソースコード
import pypyjit
pypyjit.set_param("max_unroll_recursion=-1")
import sys
sys.setrecursionlimit(5 * 10**5 + 100)
"""RollingHash
・つかい方
rh = RollingHash(S): インスタンス生成
rh.get(l, r): hash(S[l, r))
・めも
1つ目のインスタンス生成で係数cfを決めてしまうから、
たくさんインスタンスつくっても整合性がとれてる。
・参考URL
https://qiita.com/keymoon/items/11fac5627672a6d6a9f6
"""
import random
class RollingHash:
def __init__(self, S: str):
le = len(S)
if RConst.cf == 0:
RConst.cf = random.randrange(1 << 31, RConst.Mod)
if len(RConst.rui_cf) <= 5*10**5+100:
RConst.make_rui_cf(5*10**5+100)
self.hash_arr = [1]
for el in S:
self.hash_arr.append(RConst.calc_mod(
RConst.mul(self.hash_arr[-1], RConst.cf) + ord(el)))
def append(self, s:str):
self.hash_arr.append(RConst.calc_mod(
RConst.mul(self.hash_arr[-1], RConst.cf) + ord(s)))
def pop(self):
self.hash_arr.pop()
def get(self, l: int, r: int) -> int:
"hash(S[l..r))"
return RConst.sub(self.hash_arr[r],
RConst.mul(self.hash_arr[l], RConst.rui_cf[r - l]))
class RConst:
Mask30 = (1 << 30) - 1
Mask31 = (1 << 31) - 1
Mod = (1 << 61) - 1
cf = 0
rui_cf = [1]
@staticmethod
def calc_mod(x: int) -> int:
xu, xd = x >> 61, x & RConst.Mod
ret = xu + xd
if RConst.Mod <= ret:
ret -= RConst.Mod
return ret
@staticmethod
def sub(a: int, b: int) -> int:
if a < b:
return a + RConst.Mod - b
return a - b
@staticmethod
def mul(a: int, b: int) -> int:
au, ad = a >> 31, a & RConst.Mask31
bu, bd = b >> 31, b & RConst.Mask31
mid = ad * bu + au * bd
midu, midd = mid >> 30, mid & RConst.Mask30
return RConst.calc_mod(((au * bu) << 1) + midu + (midd << 31) + ad * bd)
@staticmethod
def make_rui_cf(x: int):
l = len(RConst.rui_cf)
for _ in range(x - l + 1):
RConst.rui_cf.append(RConst.mul(RConst.cf, RConst.rui_cf[-1]))
from collections import defaultdict
input = sys.stdin.readline
def main():
N,M = list(map(int,input().split()))
S = [input().strip() for _ in range(N)]
d = defaultdict(int)
end = defaultdict(int)
for i in range(N):
rh = RollingHash(S[i])
for j in range(len(S[i])):
d[rh.get(0,j+1)] += 1
end[rh.get(0,len(S[i]))] += 1
ans = []
end_count = 0
now_RH = RollingHash("")
def f():
nonlocal end_count
for i in range(26):
if(end_count >= N - M + 1):return
c = chr(ord("a") + i)
now_RH.append(c)
hash = now_RH.get(0,len(ans)+1)
end_count += end[hash]
if(end_count < N - M + 1):
if(d[hash] + end_count - end[hash] >= N - M + 1):
ans.append(c)
f()
ans.pop()
else:
print("Yes")
print("".join(ans + [c]))
exit()
end_count -= end[hash]
now_RH.pop()
f()
print("No")
main()
回転