CF580E Kefa and Watch

题目描述

有一天,鹦鹉 Kefa 在餐厅回家的路上走在街上时,看到路边有什么东西在闪闪发光。他靠近后发现那是一个手表。他决定把它带到当铺,赚点钱。 当铺老板说,每块手表都有一个序列号,用由 $0$ 到 $9$ 的数字字符串表示,序列号通过的质检越多,手表的价值就越高。每一次质检由三个正整数 $l$、$r$ 和 $d$ 定义。当连续子串 $l$ 到 $r$ 的区间具有周期 $d$ 时,这块表就通过了这次质检。有时,老板一走神,Kefa 就会把序列号的某个子串里的所有数字改成 $c$,以便让手表更值钱。 老板事情太多,无暇顾及,而 Kefa 又在瞎折腾,于是老板给了你一个任务:写一个程序来判断手表的价值。 我们提醒你,若字符串 $s$ 存在一个数字 $x$ 是其周期($1 \le x \le |s|$),当且仅当对于所有 $i\in [1, |s|-x]$ ,都有 $s_{i}=s_{i+x}$ 时,称 $x$ 是字符串 $s$ 的周期。

输入格式

输入第一行为三个正整数 $n$、$m$、$k$($1 \le n \le 10^5$,$1 \le m+k \le 10^5$),分别表示序列号长度、Kefa 进行的修改次数和质检次数。 第二行为一个长度为 $n$ 的数字字符串,表示手表的序列号。 接下来 $m+k$ 行,每行是一次修改或检查操作。 - 修改操作为:1 $l$ $r$ $c$($1 \le l \le r \le n$,$0 \le c \le 9$),表示 Kefa 将从第 $l$ 位到第 $r$ 位的所有数字都替换成 $c$。 - 质检操作为:2 $l$ $r$ $d$($1 \le l \le r \le n$,$1 \le d \le r-l+1$),表示对从第 $l$ 位到第 $r$ 位的子串进行周期 $d$ 的检查。

输出格式

对于每一次检查操作,若手表通过该质检则输出一行 “YES”,否则输出一行 “NO”。

说明/提示

第一个样例测试会进行两次质检。第一次对子串 “12” 检查是否有周期 1,答案是 “NO”。第二次对子串 “88” 检查是否有周期 1,因为 88 是重复的数字序列,所以通过周期 1,所以答案是 “YES”。 第二个样例测试会进行三次质检。第一次检查子串 “3493”,它没有周期 2。第二次修改后字符串变成 “334334”,此时检查返回 “YES”。最后一次检查子串 “8334”,周期 1 不成立。 由 ChatGPT 5 翻译