1. paizaラーニングトップ
  2. レベルアップ問題集
  3. MP・KMPメニュー(言語選択)
  4. 問題一覧 Rust(Beta)編
  5. 問題 8 : 一致する接頭辞と接尾辞 5 Rust(Beta)編

MP・KMPメニューのサムネイル
問題 8 : 一致する接頭辞と接尾辞 5 Rust(Beta)編(paizaランク S 相当)

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

問題

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

英小文字からなる長さ N の文字列 S が入力として与えられるので、1 ≦ i ≦ N を満たす i それぞれについて、以下の問題に答えてください。
・S の 1 文字目から i 文字目までの部分文字列を T_{i} とする。T_{i} の接頭辞であり、接尾辞でもあるような文字列のうち最長のものの長さを出力してください。
ただし、空文字列の長さは 0 とし、
文字列 T の接頭辞、接尾辞は空文字列を含み、T 自身を含まないものとします。


例えば S = aabaaab に対して i = 5 の場合、
S の 1 文字目から i 文字目までの部分文字列は aabaa なので、
・接頭辞 : { φ, a, aa, aab, aaba }
・接尾辞 : { φ, a, aa, baa, abaa }
となります。接頭辞かつ接尾辞である文字列は φ, a, aa の 3 つなので、答えは aa の長さである 2 となります。

ヒント :
以下にアルゴリズムの方針を軽く示すので、参考にしてください。
i 文字目までの部分文字列に対する答えを dp_i とします。

i 文字目までの部分文字列が一致するためには、画像の赤い部分が一致する必要があることに注意すると、何かが見えてくるかもしれません。

入力される値

入力は以下のフォーマットで与えられます

N
S

1 行目には文字列の長さを表す整数 N が与えられ、2 行目には文字列 S が与えられます。


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

1 ≦ i ≦ N を満たす i それぞれについて、
i 行目に
・S の 1 文字目から i 文字目までの部分文字列について、接頭辞であり、接尾辞でもあるような文字列のうち最長のものの長さを表す整数
を出力してください。
ただし、最後には改行を入れ、
余計な文字や空白、空行を出力しないようにしてください。

条件

すべてのテストケースにおいて、以下の条件を満たします。
・2 ≦ N ≦ 1000000
・S は英小文字のみからなる文字列

入力例1

11
abracadabra

出力例1

0
0
0
1
0
1
0
1
2
3
4

問題一覧へ戻る

ページの先頭へ戻る