2019-05-14 17:15:53 +00:00
|
|
|
|
# calculate palindromic length from center with incrementing difference
|
2019-10-05 05:14:13 +00:00
|
|
|
|
def palindromic_length(center, diff, string):
|
|
|
|
|
if (
|
|
|
|
|
center - diff == -1
|
|
|
|
|
or center + diff == len(string)
|
|
|
|
|
or string[center - diff] != string[center + diff]
|
|
|
|
|
):
|
2019-01-02 11:17:56 +00:00
|
|
|
|
return 0
|
2019-10-05 05:14:13 +00:00
|
|
|
|
return 1 + palindromic_length(center, diff + 1, string)
|
2019-01-02 11:17:56 +00:00
|
|
|
|
|
2019-10-05 05:14:13 +00:00
|
|
|
|
|
|
|
|
|
def palindromic_string(input_string):
|
2019-01-02 11:17:56 +00:00
|
|
|
|
"""
|
|
|
|
|
Manacher’s algorithm which finds Longest Palindromic Substring in linear time.
|
|
|
|
|
|
|
|
|
|
1. first this conver input_string("xyx") into new_string("x|y|x") where odd positions are actual input
|
|
|
|
|
characters.
|
|
|
|
|
2. for each character in new_string it find corresponding length and store,
|
|
|
|
|
a. max_length
|
|
|
|
|
b. max_length's center
|
|
|
|
|
3. return output_string from center - max_length to center + max_length and remove all "|"
|
|
|
|
|
"""
|
|
|
|
|
max_length = 0
|
2019-10-05 05:14:13 +00:00
|
|
|
|
|
2019-01-02 11:17:56 +00:00
|
|
|
|
# if input_string is "aba" than new_input_string become "a|b|a"
|
|
|
|
|
new_input_string = ""
|
|
|
|
|
output_string = ""
|
|
|
|
|
|
|
|
|
|
# append each character + "|" in new_string for range(0, length-1)
|
2019-10-05 05:14:13 +00:00
|
|
|
|
for i in input_string[: len(input_string) - 1]:
|
2019-01-02 11:17:56 +00:00
|
|
|
|
new_input_string += i + "|"
|
2019-10-05 05:14:13 +00:00
|
|
|
|
# append last character
|
2019-01-02 11:17:56 +00:00
|
|
|
|
new_input_string += input_string[-1]
|
|
|
|
|
|
|
|
|
|
# for each character in new_string find corresponding palindromic string
|
2019-10-05 05:14:13 +00:00
|
|
|
|
for i in range(len(new_input_string)):
|
2019-01-02 11:17:56 +00:00
|
|
|
|
|
|
|
|
|
# get palindromic length from ith position
|
|
|
|
|
length = palindromic_length(i, 1, new_input_string)
|
|
|
|
|
|
|
|
|
|
# update max_length and start position
|
2019-10-05 05:14:13 +00:00
|
|
|
|
if max_length < length:
|
2019-01-02 11:17:56 +00:00
|
|
|
|
max_length = length
|
|
|
|
|
start = i
|
2019-10-05 05:14:13 +00:00
|
|
|
|
|
|
|
|
|
# create that string
|
|
|
|
|
for i in new_input_string[start - max_length : start + max_length + 1]:
|
2019-01-02 11:17:56 +00:00
|
|
|
|
if i != "|":
|
|
|
|
|
output_string += i
|
2019-10-05 05:14:13 +00:00
|
|
|
|
|
2019-01-02 11:17:56 +00:00
|
|
|
|
return output_string
|
|
|
|
|
|
|
|
|
|
|
2019-10-05 05:14:13 +00:00
|
|
|
|
if __name__ == "__main__":
|
2019-01-02 11:17:56 +00:00
|
|
|
|
n = input()
|
|
|
|
|
print(palindromic_string(n))
|