# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
998535 | Ibrohim0704 | 회문 (APIO14_palindrome) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
def manacher(s):
"""Manacher's Algorithm to find all palindromic substrings in linear time."""
s = '#' + '#'.join(s) + '#'
n = len(s)
p = [0] * n
c = 0
r = 0
for i in range(n):
mirror = 2 * c - i
if i < r:
p[i] = min(r - i, p[mirror])
while i + p[i] + 1 < n and i - p[i] - 1 >= 0 and s[i + p[i] + 1] == s[i - p[i] - 1]:
p[i] += 1
if i + p[i] > r:
c = i
r = i + p[i]
return s, p
def find_max_palindrome_occurrence_value(s):
original_s = s
s, p = manacher(s)
n = len(p)
# To store the count of each palindrome
palindrome_count = {}
for i in range(n):
length = p[i]
if length > 0:
start = (i - length) // 2
for l in range(1, length + 1):
pal_sub = original_s[start:start + l]
if pal_sub in palindrome_count:
palindrome_count[pal_sub] += 1
else:
palindrome_count[pal_sub] = 1
start -= 1
max_occurrence_value = 0
for pal, count in palindrome_count.items():
occurrence_value = len(pal) * count
if occurrence_value > max_occurrence_value:
max_occurrence_value = occurrence_value
return max_occurrence_value
# Read input from file
with open('palindrome.in', 'r') as file:
s = file.read().strip()
# Calculate the maximum occurrence value of palindromic substrings
result = find_max_palindrome_occurrence_value(s)
# Write output to file
with open('palindrome.out', 'w') as file:
file.write(str(result) + '\n')