結果
| 問題 |
No.263 Common Palindromes Extra
|
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-05-14 12:49:08 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 3,176 bytes |
| コンパイル時間 | 322 ms |
| コンパイル使用メモリ | 82,240 KB |
| 実行使用メモリ | 536,424 KB |
| 最終ジャッジ日時 | 2025-05-14 12:50:49 |
| 合計ジャッジ時間 | 9,099 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 TLE * 1 MLE * 3 |
ソースコード
import sys
MOD = 10**18 + 3
BASE = 911382629
class Node:
__slots__ = ['length', 'suffix_link', 'transitions', 'hash', 'cnt']
def __init__(self, length, suffix_link):
self.length = length
self.suffix_link = suffix_link
self.transitions = {}
self.hash = 0
self.cnt = 0
def precompute_powers(max_len, base, mod):
pow = [1] * (max_len + 2)
for i in range(1, max_len + 2):
pow[i] = (pow[i-1] * base) % mod
return pow
def build_eertree(s, pow_table, base, mod):
root_neg = Node(-1, None)
root_neg.suffix_link = root_neg
root_0 = Node(0, root_neg)
root_0.suffix_link = root_neg
nodes = [root_neg, root_0]
last = root_0
s_list = list(s)
for idx in range(len(s_list)):
c = s_list[idx]
current = last
while True:
candidate = current
clen = candidate.length
pos = idx - clen - 1
if pos >= 0 and s_list[pos] == c:
break
current = current.suffix_link
if c in current.transitions:
last = current.transitions[c]
last.cnt += 1
continue
new_node = Node(current.length + 2, None)
nodes.append(new_node)
if new_node.length == 1:
new_node.suffix_link = root_0
else:
suffix = current.suffix_link
while True:
clen_suffix = suffix.length
pos_suffix = idx - clen_suffix - 1
if pos_suffix >= 0 and s_list[pos_suffix] == c and c in suffix.transitions:
new_node.suffix_link = suffix.transitions[c]
break
if suffix.length == -1:
new_node.suffix_link = root_0
break
suffix = suffix.suffix_link
if current.length == -1:
new_node.hash = ord(c) % mod
elif current.length == 0:
new_node.hash = (ord(c) * base + ord(c)) % mod
else:
new_node.hash = (ord(c) * pow_table[current.length + 1] + current.hash * base + ord(c)) % mod
current.transitions[c] = new_node
last = new_node
last.cnt = 1
nodes_sorted = sorted(nodes[2:], key=lambda x: -x.length)
for node in nodes_sorted:
if node.suffix_link:
node.suffix_link.cnt += node.cnt
hash_map = {}
for node in nodes:
if node.length > 0:
h = node.hash
cnt = node.cnt
if h in hash_map:
hash_map[h] += cnt
else:
hash_map[h] = cnt
return hash_map
def main():
s = sys.stdin.readline().strip()
t = sys.stdin.readline().strip()
max_len_s = len(s) * 2 + 2
max_len_t = len(t) * 2 + 2
pow_s = precompute_powers(max_len_s, BASE, MOD)
pow_t = precompute_powers(max_len_t, BASE, MOD)
hash_map_s = build_eertree(s, pow_s, BASE, MOD)
hash_map_t = build_eertree(t, pow_t, BASE, MOD)
result = 0
for h, cnt_s in hash_map_s.items():
cnt_t = hash_map_t.get(h, 0)
result += cnt_s * cnt_t
print(result)
if __name__ == "__main__":
main()
qwewe