变长字符串
题号:NC214192
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

一个整数n,表示初始字符串 s 的长度,字符串 s 全部由26种小写字母构成,q次操作,每次操作可能是如下情况:
1 c : 在串s后面添加一个小写字母 c (即字符串 s 后面加一个字符 c,字符串 s 的长度加一)。
2 x y L : 询问s的子串 s[x]...s[x+L-1]和s[y]...s[y+L-1]是否相同。(x,y下标从1开始 )。
两个字符串a、b相同当且仅当a串和b串的长度相同(假设长度都为L),且a[1]=b[1],a[2]=b[2]...a[L]=b[L]。

输入描述:

第一行,两个整数n, q, 表示字符串s的初始长度。
第二行,字符串s。
接下来 q 行,每行开头有一个整数op,如果 op = 1 ,那么接着有一个字符 c ;如果 op = 2 ,则有三个整数 x, y, L。

输出描述:

对于每个 2 操作,如果s的子串 s[x]...s[x+L-1]和s[y]...s[y+L-1]相同,则输出“YES”(没有双引号); 否则输出“NO”(没有双引号)。
示例1

输入

复制
6 6
abcabc
2 1 4 3
1 b
2 2 5 3
1 c
2 2 5 2
2 2 7 2

输出

复制
YES
NO
YES
YES

说明

第一次操作:s[1] = s[4], s[2] = s[5], s[3] = s[6],则输出YES
第二次操作:添加一个字符b,则字符串 s 变为 abcabcb
第三次操作:s[2] = s[5], s[3] = s[6], s[4] != s[7],则输出NO
第四次操作:添加一个字符c,则字符串 s 变为 abcabcbc
第五次操作:s[2] = s[5], s[3] = s[6],则输出YES
第六次操作:s[2] = s[7], s[3] = s[8],则输出YES

备注:

,保证x+L-1和y+L-1在任何时候都大于等于1且小于等于当前字符串的长度。