1. paizaラーニングトップ
  2. レベルアップ問題集
  3. Zアルゴリズムメニュー(言語選択)
  4. 問題一覧 Java編
  5. 短い文字列の Z 配列 Java編

Zアルゴリズムメニューのサムネイル
短い文字列の Z 配列 Java編(paizaランク B 相当)

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

問題

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

この問題集のゴールは、文字列 s が与えられたときに、s の各部分文字列 s_{i, |s|} の最長共通接頭辞の長さをすべて求めることです。i 番目に s と s_{i, |s|} の最長共通接頭辞の長さを並べた配列を Z 配列と呼びます。

まずは簡単な例を考えてみましょう。
文字列 'aaabb' なら、文字列の 1 文字目から始まる部分文字列は文字列そのものなので 5 に, 2 文字目から始まる部分文字列は 'aabb' なので 2 に, 3 文字目から始まる部分文字列は 'abb' なので 1 に, 4 文字目から始まる部分文字列は 'bb' なので 0 に, 5 文字目から始まる部分文字列は 'b' なので 0 になります。よって、この文字列の Z 配列は〈5, 2, 1, 0, 0〉となります。

では、与えられた文字列の Z 配列を求めてみましょう。
文字列 s が与えられるので、各 i = 1, 2, ..., |s| について、s と s_{i, |s|} の最長共通接頭辞の長さ z_i を求めてください。

入力される値

s

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


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

s の Z 配列 z_1, z_2, ..., z_{|s|} を改行区切りで出力してください。
また、末尾に改行を入れ、余計な文字を含んではいけません。

条件

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

・ 1 ≦ |s| ≦ 1000
・ s は英小文字のみからなる文字列

入力例1

abcabca

出力例1

7
0
0
4
0
0
1

問題一覧へ戻る

ページの先頭へ戻る