結果
| 問題 | No.263 Common Palindromes Extra |
| コンテスト | |
| ユーザー |
neterukun
|
| 提出日時 | 2021-10-04 23:30:46 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,180 bytes |
| 記録 | |
| コンパイル時間 | 189 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 597,072 KB |
| 最終ジャッジ日時 | 2024-07-23 00:19:49 |
| 合計ジャッジ時間 | 10,328 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 8 MLE * 4 |
ソースコード
class Node:
def __init__(self, length, count):
self.length = length
self.count = count
self.suffix_link = 0
self.link = {}
class Eertree:
def __init__(self):
self.nodes = []
self.string = []
self.root_odd = Node(-1, 0)
self.nodes.append(self.root_odd)
self.root_even = Node(0, 0)
self.nodes.append(self.root_even)
self.cur = 0
def prev_palindrome_node(self, idx):
size = len(self.string) - 1
while True:
i = size - 1 - self.nodes[idx].length
if i >= 0 and self.string[i] == self.string[-1]:
break
idx = self.nodes[idx].suffix_link
return idx
def add(self, char):
self.string.append(char)
idx = self.prev_palindrome_node(self.cur)
if char in self.nodes[idx].link:
self.cur = self.nodes[idx].link[char]
self.nodes[self.cur].count += 1
return
self.nodes[idx].link[char] = len(self.nodes)
new = Node(self.nodes[idx].length + 2, 1)
self.nodes.append(new)
self.cur = self.nodes[idx].link[char]
if new.length == 1:
new.suffix_link = 1
else:
idx = self.prev_palindrome_node(self.nodes[idx].suffix_link)
new.suffix_link = self.nodes[idx].link[char]
def frequency_build(self):
n = len(self.nodes)
freq = [0] * n
for i in reversed(range(n)):
freq[i] += self.nodes[i].count
freq[self.nodes[i].suffix_link] += freq[i]
return freq
s = input()
t = input()
et_s = Eertree()
for char in s:
et_s.add(char)
et_t = Eertree()
for char in t:
et_t.add(char)
freq_s = et_s.frequency_build()
freq_t = et_t.frequency_build()
ans = 0
stack = [(0, 0), (1, 1)]
while stack:
idx_s, idx_t = stack.pop()
if idx_s > 1:
ans += freq_s[idx_s] * freq_t[idx_t]
for char in et_s.nodes[idx_s].link:
if char in et_t.nodes[idx_t].link:
nxt_s = et_s.nodes[idx_s].link[char]
nxt_t = et_t.nodes[idx_t].link[char]
stack.append((nxt_s, nxt_t))
print(ans)
neterukun