#P51208. 「ROI 2019 Day2」模式串查找

「ROI 2019 Day2」模式串查找

题目描述

译自 ROI 2019 Day2 T4. Поиск идеи

给出模式串 pp,其长度为 mm。又给出「压缩后的」文本串 tt,试求 pptt 中出现的次数。两个字符串均只包含小写英文字母。

压缩后的 tt 分为 nn 个有顺序的块。块的类型及解压方式如下:

  • 开始解压时 tt 为空串。
  • 1 w\tt1\it\ w,其中 ww 是一个字符串。在解压过程中,当读取到这一块时,将 ww 放在 tt 的末尾。
  • 2 pos len\tt2\rm\ pos\ len,将 tpost_{\rm pos} 复制到 tt 的末尾,再将 tpos+1t_{\mathrm{pos}+1} 复制到 tt 的末尾……共复制 len\rm len 个字符。比如,如果 t=abat=\tt aba,当前块为 2 1 72\ 1\ 7,则 tt 会变为 abaabaabaa\tt abaabaabaa

输入格式

m,nm,n
pp
接下来 nn 行,每行一个块

样例

3 4
aba
1 ab
2 1 3
2 3 3
2 1 8
6

开始:空串 读取第一块后:ab\tt ab 读取第二块后:ababa\tt ababa 读取第三块后:ababaaba\tt ababaaba 读取第四块后:ababaabaababaaba\tt ababaabaababaaba

ababaabaababaabaaba  aba  aba     aba   aba  aba\tt ababaabaababaaba\\aba\ \ aba\ \ aba\ \ \ \\\ \ aba\ \ \ aba\ \ aba

数据范围与提示

LiL_i 表示读取第 ii 块后 tt 的长度。 如果第 ii 个块属于第二类块,我们用 posi\mathrm{pos}_ileni\mathrm{len}_i 特指这个块的 pos\rm poslen\rm len

子任务 # 分值 mm⩽ nn⩽ LnL_n⩽ 额外条件
1 6 2000\color{#068}{2000} =1\color{#000}{=1} 1000\color{#068}{1000}
2 10 105\color{#0a5}{10^5} 2000\color{#068}{2000} 106\color{#960}{10^6}
3 10 2000\color{#068}{2000} 1010\color{#a50}{10^{10}} 对于任意一个第二类块,
posi=1\mathrm{pos}_i=1leni\mathrm{len}_iL1L_1 的因数
4 10 posi=Li1\mathrm{pos}_i = L_{i−1}
5 10 20\color{#000}{20} posi=1,leni107\mathrm{pos}_i=1, \mathrm{len}_i⩽10^7
6 4 2000\color{#068}{2000}
7 10 20\color{#000}{20} 20\color{#000}{20} 文本串里只包含 a\tt a
posi+leni1Li1\mathrm{pos}_i+\mathrm{len}i-1⩽L_{i–1}
8 6 posi+leni1Li1\mathrm{pos}_i+\mathrm{len}_i-1⩽L_{i–1}
9 2 =1\color{#000}{=1} 2000\color{#068}{2000} 文本串里只包含 a\tt a
10 4 20\color{#000}{20}
11 5
12 14 105\color{#0a5}{10^5}
13 9 2×105\color{#790}{2×10^5} 104\color{#085}{10^4} 1015\color{#e30}{10^{15}}

对于所有子任务,保证 wi2×105\sum |w_i|\le 2\times 10^5