1. paizaラーニングトップ
  2. レベルアップ問題集
  3. Manacherのアルゴリズムメニュー(言語選択)
  4. 問題一覧 Perl編
  5. 対称文 Perl編

Manacherのアルゴリズムメニューのサムネイル
対称文 Perl編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

以下の英小文字の組を互いに対称な文字と定義します。
b <=> d
i <=> i
l <=> l
m <=> m
n <=> n
o <=> o
p <=> q
s <=> z
t <=> t
u <=> u
v <=> v
w <=> w
x <=> x
また、互いに対称な文字の組を左右逆に並べたものも互いに対称な文字の組とみなします。

つづいて、対称文 x を、つぎのように定義します。
x が空文字列であるとき、x は対称文です。
a と a が互いに対称な文字の組であるとき、a は対称文です。
x が対称文であり、a と b が互いに対称な文字の組であるとき、axb も対称文です。

たとえば、bid, bud, noon は対称文です。

文字列 s が与えられます。このとき、s の 1, 2, 3, ..., |s| 番目の文字を中心としたときの最長対称文半径を求めてください。
なお、文字を中心とする最長対称文半径とは、その文字を中心とする対称文の最大の長さを n としたとき、(n + 1) / 2 のことを言います。

入力される値

s

・ 1 行目に、文字列 s が与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

s の 1, 2, 3, ..., |s| 番目の文字を中心としたときの最長対称文半径を、改行区切りで上から順に出力してください。

また、末尾に改行を入れ、余計な文字を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ |s| ≦ 100000 = 10^5
・ s は英小文字のみからなる文字列

入力例1

bidinibid

出力例1

0
2
0
1
5
1
0
2
0

問題一覧へ戻る

ページの先頭へ戻る