#P0602. 前缀与后缀

前缀与后缀

题目描述

给定一个字符串 s=s1s2sss = s_1 s_2 \ldots s_{|s|}。这里 s|s| 表示字符串 ss 的长度,我们用 sis_i 表示字符串 ss 中的第 ii 个字符。

我们有如下定义:

  • 字符串的子串 s[i..j](1ijs)s[i..j](1 \le i \le j \le |s|) 表示的是 sisi+1sjs_i s_{i+1} \ldots s_j
  • 字符串的长度为 l(1ls)l(1 \le l \le |s|) 的前缀指的是子串 s[1..l]s[1..l]
  • 字符串的长度为 l(1ls)l(1 \le l \le |s|) 的后缀指的是字符串 s[sl+1..s]s[|s|-l+1..|s|]

你的任务是:对于任意一个长度 ll,在长度为 ll 的前缀等于长度为 ll 的后缀的情况下,字符串 ss 中存在多少个长度为 ll 的子串等于前缀。

输入格式

输入共一行,包含一个字符串 s1s2ss(1s105)s_1 s_2 \ldots s_|s|(1 \le |s| \le 10^5)。数据保证字符串仅由大写英文字母组成。

输出格式

输出的第一行包含一个整数 k(0ks)k(0 \le k \le |s|),表示前缀和后缀能够匹配上的长度有多少个。

接下来 kk 行,每行包含两个整数 lil_icic_i,以一个空格分隔。其中 lil_i 表示前缀长度(即要求长度为 lil_i 的前缀等于长度为 lil_i 的后缀),cic_i 表示字符串中存在多少个子串等于长度为 lil_i 的前缀。

要求按照 lil_i 递增的顺序输出所有 lil_icic_i

样例

ABACABA
3
1 4
3 2
7 1
AAA
3
1 3
2 2
3 1

说明/提示

样例解释

样例1:

  • l1=1l_1 = 1 时,满足条件的子串有 s[1..1]=s[3..3]=s[5..5]=s[7..7]=s[1..1] = s[3..3] = s[5..5] = s[7..7] = 'A'
  • l2=3l_2 = 3 时,满足条件的子串有 s[1..3]=s[4..7]=s[1..3] = s[4..7] = 'ABA'
  • l3=7l_3 = 7 时,满足条件的子串有 s[1..7]=s[1..7] = 'ABACABA'

样例2:

  • l1=1l_1 = 1 时,满足条件的子串有 s[1..1]=s[2..2]=s[3..3]=s[1..1] = s[2..2] = s[3..3] = 'A'
  • l2=2l_2 = 2 时,满足条件的子串有 s[1..2]=s[2..3]=s[1..2] = s[2..3] = 'AA'
  • l3=3l_3 = 3 时,满足条件的子串有 s[1..3]=s[1..3] = 'AAA'

数据规模与约定

  • 对于 30%30\% 的数据,s100|s| \le 100
  • 对于 60%60\% 的数据,s104|s| \le 10^4
  • 对于 100%100\% 的数据,1s1051 \le |s| \le 10^5