問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
前回の問題の文字列には $ が含まれていましたが、$ が含まれていない場合や文字列の一部が繰り返されている場合はどうなるでしょうか。
たとえば、'abababab' という文字列を考えてみます。この文字列についても前半の Z 配列と後半の Z 配列は同じになりそうな気がしますね。しかし、実際の Z 配列は〈8, 0, 6, 0, 8, 0, 6, 0〉とはなりません。これは、うしろから x 番目の Z 配列の値が x 以下になるからです。実際、この文字列の Z 配列は〈8, 0, 6, 0, 4, 0, 2, 0〉 となります。
この性質を利用して、Z 配列を求めてみましょう。
文字列 s と、s の m 文字目までの Z 配列が与えられます。s は、z_m = |s_{m, |s|}| となるような文字列です。このとき、s の Z 配列をすべて求めてください。
s
m
z_1 z_2 ... z_m
s の Z 配列 z_1, z_2, ..., z_|s| を改行区切りで出力してください。
また、末尾に改行を入れ、余計な文字を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 3 ≦ |s| ≦ 100000 = 10^5
・ |s|/2 < m ≦ |s|
・ 0 ≦ z_i ≦ |s| (1 ≦ i ≦ m)
・ s は英小文字のみからなる文字列
・ z_m = |s_{m, |s|}|
abcabcabcabc
7
12 0 0 9 0 0 6
12
0
0
9
0
0
6
0
0
3
0
0