結果
| 問題 |
No.1494 LCS on Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-04-30 22:27:12 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,200 bytes |
| コンパイル時間 | 304 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 210,816 KB |
| 最終ジャッジ日時 | 2024-07-19 02:00:39 |
| 合計ジャッジ時間 | 29,012 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 2 |
| other | AC * 9 WA * 33 TLE * 1 -- * 4 |
ソースコード
import sys
input = lambda : sys.stdin.readline().rstrip()
sys.setrecursionlimit(2*10**5+10)
write = lambda x: sys.stdout.write(x+"\n")
debug = lambda x: sys.stderr.write(x+"\n")
# 木の読み込み・重みあり
n = int(input())
s = [(ord(c)-ord("a")) for c in input()]
m = len(s)
ns = [[] for _ in range(n)]
for _ in range(n-1):
u,v,c = input().split()
c = ord(c) - ord("a")
u = int(u)
v = int(v)
u -= 1
v -= 1
ns[u].append((c,v))
ns[v].append((c,u))
dp0 = [-1]*n
dp1 = [-1]*n
ans = 0
def sub(l,c):
nl = [0]
for i in range(m):
if s[i]==c:
if i>=1:
v = l[i]+1
else:
v = 1
else:
v = l[i]
nl.append(max(v, nl[-1]))
return nl
def sub2(l,c):
nl = [0]
for i in range(m)[::-1]:
if s[i]==c:
if i+1<m:
v = l[i]+1
else:
v = 1
else:
v = l[i]
nl.append(max(v, nl[-1]))
return nl[::-1]
def sub3(l0,l1):
k = len(l0)
ans = 0
for i in range(k):
for j in range(k):
if i==j:
continue
ans = max(ans, max((l0[i][ind]+l1[j][ind] for ind in range(len(l0)))))
ans = max(ans, max((item[-1] for item in l0)), max((item[0] for item in l1)))
return ans
# 深さ優先探索 (巻き戻しあり) dfs tree
q = [(0, -1)]
while q:
u,prv = q.pop()
if u<0:
# 返るときの処理
u = ~u
l0 = []
l1 = []
for c,v in ns[u]:
if v==prv:
continue
v0 = sub(dp0[v],c)
v1 = sub2(dp1[v],c)
l0.append(v0)
l1.append(v1)
# print(c,v0,v1)
if l0:
ans = max(ans, sub3(l0,l1))
dp0[u] = [max(item[i] for item in l0) for i in range(m+1)]
dp1[u] = [max(item[i] for item in l1) for i in range(m+1)]
else:
dp0[u] = [0]*(m+1)
dp1[u] = [0]*(m+1)
else:
q.append((~u,prv))
for c,v in ns[u]:
# 進むときの処理
if v==prv:
continue
q.append((v,u))
print(ans)