公式
D - Pre-Palindrome 解説
by
D - Pre-Palindrome 解説
by
sounansya
まず奇数長の良い文字列の個数を求めます。
良い文字列の中央の文字の位置を全探索します。この中央の文字を \(i\) 番目とします。
中央が \(i\) 番目で長さ \(2k+1\) の部分文字列が良い文字列になることは \(S_{i-j}\neq S_{i+j}\) を満たす \(j=1,2,\ldots,k\) の個数が \(1\) 個以下となることと同値です。したがって、\(k\) の昇順に \(S_{i-j}\neq S_{i+j}\) となる \(1\le j\le k\) の個数が \(1\) 個以下であるか判定すれば良いです。
偶数長の良い文字列の個数も同様に求めることができます。
以上を適切に実装することでこの問題に正答することができます。計算量は \(O(N^2)\) です。
s = input()
n = len(s)
ans = 0
for k in range(2):
for st in range(n):
l, r = st - k, st
cnt = 0
while 0 <= l and r < n:
if s[l] != s[r]:
cnt += 1
if cnt == 2:
break
l -= 1
r += 1
ans += 1
print(ans)
Bonus:\(|S| \le 10^5\) で解いてみてください。
投稿日時:
最終更新:
