C1090 [Contest #6]字符串

内存限制:256 MB 时间限制:2000 ms

题目描述

Illyasviel:"你喜欢字符串吗?"

Star-dust:"喜欢!"

Illyasviel:"那来求每个子串两两之间的最长公共前缀的长度之和吧!"

Star-dust:"好啊,但求一个不够过瘾,对所有后缀都求一遍吧。"

定义一个函数 $f(S)$ 如下:

$S$ 是一个字符串,令 $n$ 为此字符串的长度,于是 $S$ 会有 $\frac{n \times (n+1)}{2}$ 个非空子串,那么选 $S$ 的两个有序的非空子串对,就会有 $(\frac{n \times (n+1)}{2})^2$ 种组合,$f(S)$ 的值就是这 $(\frac{n \times (n+1)}{2})^2$ 个组合的两个字串间最长公共前缀的和。

例如 $f($"ab"$)$ 的计算方法如下:

"ab" 的子串总共有 "b","ba","a" 三个。

"b" 和 "b" 的最长公共前缀是 $1$。

"b" 和 "ba" 的最长公共前缀是 $1$。

"b" 和 "a" 的最长公共前缀是 $0$。

"ba" 和 "b" 的最长公共前缀是 $1$。

"ba" 和 "ba" 的最长公共前缀是 $2$。

"ba" 和 "a" 的最长公共前缀是 $0$。

"a" 和 "b" 的最长公共前缀是 $0$。

"a" 和 "ba" 的最长公共前缀是 $0$。

"a" 和 "a" 的最长公共前缀是 $1$。

所以 $f($"ab"$) = 1+1+0+1+2+0+0+0+1=6$ 。

现在给定你一个字符串 $T$,其长度为 $m$,对于每个 $i$ 从 $1$ 至 $m$,都计算出 $f(T_{i..m})$ ($T_{i..m}$ 就是 $T$ 由第 $i$ 个字母算起的后缀)。

输入格式

共一行,一个字符串 $T$。

数据范围:

  • $T$ 的所有字符都是小写字母。
  • $|T| \leq 2 \times 10^5$

输出

令 $m$ 为 $T$ 的长度。

输出一行 $m$ 个数,第 $i$ 个数代表对 $T_{i..m}$ 这个后缀的所有子串的两两之间的最长公共前缀求和,也就是 $f(T_{i..m})$ 的值。

输出对998244353取模

样例

样例输入 1

abba

样例输出 1

70 32 6 1

样例输入 2

abaaababa

样例输出 2

1993 1160 804 394 195 78 26 6 1

提示

第一个样例的输出第三个数字 $f(T_{3..4})$ 的解释正好就是叙述里的范例。