公式

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)\) です。

実装例(Python3)

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\) で解いてみてください。

投稿日時:
最終更新: