結果
| 問題 |
No.263 Common Palindromes Extra
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 15:40:16 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,946 bytes |
| コンパイル時間 | 177 ms |
| コンパイル使用メモリ | 82,800 KB |
| 実行使用メモリ | 539,716 KB |
| 最終ジャッジ日時 | 2025-06-12 15:40:25 |
| 合計ジャッジ時間 | 7,001 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 MLE * 4 |
ソースコード
import sys
class EertreeNode:
def __init__(self):
self.length = 0
self.edges = dict()
self.suffix_link = None
self.hash_val = 0
self.count = 0
def compute_hash(c_val, parent, power, P, mod):
if parent.length == -1:
return c_val % mod
else:
term1 = (c_val * (power[parent.length + 1] + 1)) % mod
term2 = (parent.hash_val * power[1]) % mod
new_hash = (term1 + term2) % mod
return new_hash
def build_eertree(s, power, P, mod):
root = EertreeNode()
root.length = -1
root.suffix_link = root
root.hash_val = 0
another_root = EertreeNode()
another_root.length = 0
another_root.suffix_link = root
another_root.hash_val = 0
tree = [root, another_root]
last = another_root
for i, c in enumerate(s):
current = last
c_val = ord(c) - ord('A') + 1
while True:
edge_length = current.length
if i - edge_length - 1 >= 0 and s[i - edge_length - 1] == c:
break
current = current.suffix_link
if c in current.edges:
last = current.edges[c]
last.count += 1
continue
new_node = EertreeNode()
new_node.length = current.length + 2
new_node.edges = dict()
new_node.suffix_link = None
new_node.hash_val = compute_hash(c_val, current, power, P, mod)
new_node.count = 1
tree.append(new_node)
current.edges[c] = new_node
if new_node.length == 1:
new_node.suffix_link = another_root
else:
temp = current.suffix_link
while True:
edge_length = temp.length
if i - edge_length - 1 >= 0 and s[i - edge_length - 1] == c:
new_node.suffix_link = temp.edges.get(c, another_root)
break
temp = temp.suffix_link
last = new_node
nodes = sorted(tree, key=lambda x: -x.length)
for node in nodes:
if node.suffix_link is not None and node.suffix_link.length != -1:
node.suffix_link.count += node.count
hash_map = dict()
for node in tree:
if node.length == -1 or node.length == 0:
continue
key = node.hash_val
if key not in hash_map:
hash_map[key] = 0
hash_map[key] += node.count
return hash_map
def main():
S = sys.stdin.readline().strip()
T = sys.stdin.readline().strip()
P = 911382629
mod = 10**18 + 3
max_len = 500000
power = [1] * (max_len + 2)
for i in range(1, max_len + 2):
power[i] = (power[i-1] * P) % mod
hash_S = build_eertree(S, power, P, mod)
hash_T = build_eertree(T, power, P, mod)
result = 0
for key in hash_S:
if key in hash_T:
result += hash_S[key] * hash_T[key]
print(result)
if __name__ == "__main__":
main()
gew1fw