問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
回文には対称性、つまり前後を反転させても同じになる性質があります。
ここで、回文の最長回文半径がどうなっているか見てみましょう。
たとえば、回文 'aaabbbaaa' の最長回文半径は〈1, 2, 1, 1, 5, 1, 1, 2, 1〉です。
これをよく見ると、最長回文半径そのものも対称性を持っていることがわかります。
この対称性を利用することで、最長回文半径の計算を効率的におこなうことができます。
では、実際に対称性を利用して最長回文半径を求めてみましょう。
文字列 s と、s の 1, 2, 3, ..., |s|/2 番目の文字を中心としたときの最長回文半径 p_1, p_2, ..., p_{|s|/2}が与えられます。
このとき、s の最長回文半径をすべて求めてください。
なお、文字を中心とする最長回文半径とは、その文字を中心とする回文の最大の長さを n としたとき、(n + 1) / 2 のことを言います。
s
p_1 p_2 ... p_{|s|/2}
s の 1, 2, 3, ..., |s| 番目の文字を中心としたときの最長回文半径を、改行区切りで上から順に出力してください。
また、末尾に改行を入れ、余計な文字を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ |s| ≦ 100000 = 10^5
・ |s| は偶数
・ s は英小文字のみからなる文字列
・ p_i は i 番目の文字を中心としたときの最長回文半径を表す整数 (1 ≦ i ≦ |s|/2)
aaabbbbaaa
1 2 1 1 2
1
2
1
1
2
2
1
1
2
1