CF570C Replacement

题目描述

丹尼尔有一个字符串 $s$,由小写英文字母和句点符号(字符 '.')组成。我们将替换操作定义为以下步骤:在字符串 $s$ 中找到一个子串“..”(即两个连续的句点),在所有出现的子串中选择第一个,并将该子串替换为“.”。换句话说,每次替换操作会将第一个两个连续的句点替换为一个句点。如果字符串 $s$ 中没有连续的两个句点,则什么也不发生。 我们定义 $f(s)$ 为最少需要多少次替换操作,使得字符串中不再有连续的两个句点。 你需要处理 $m$ 个询问,第 $i$ 个询问会将字符串 $s$ 的第 $x_{i}$ 个字符($1 \leq x_{i} \leq n$)修改为 $c_{i}$。每次操作后,你都需要计算并输出 $f(s)$ 的值。 请帮助丹尼尔处理所有询问。

输入格式

第一行包含两个整数 $n$ 和 $m$($1 \leq n, m \leq 300000$),分别表示字符串的长度和询问的数量。 第二行包含一个长度为 $n$ 的字符串 $s$,由小写英文字母和句点组成。 接下来的 $m$ 行每行包含一个整数 $x_{i}$ 和一个字符 $c_{i}$($1 \leq x_{i} \leq n$,$c_{i}$ 为小写英文字母或句点),表示将字符串第 $x_i$ 个字符修改为 $c_i$ 的操作。

输出格式

输出 $m$ 行,第 $i$ 行输出第 $i$ 次赋值操作后 $f(s)$ 的值。

说明/提示

对第一个样例的说明(被替换的句点对用方括号括起来): 原始字符串为 ".b..bz...."。 - 第一次询问后 $f($hb..bz....$) = 4$("hb\[..\]bz...." $\to$ "hb.bz\[..\].." $\to$ "hb.bz\[..\]." $\to$ "hb.bz\[..\]" $\to$ "hb.bz.") - 第二次询问后 $f($hbс.bz....$) = 3$("hbс.bz\[..\].." $\to$ "hbс.bz\[..\]." $\to$ "hbс.bz\[..\]" $\to$ "hbс.bz.") - 第三次询问后 $f($hbс.bz..f.$) = 1$("hbс.bz\[..\]f." $\to$ "hbс.bz.f.") 对第二个样例的说明: 原始字符串为 ".cc."。 - 第一次询问后: $f($..c.$) = 1$("\[..\]c." $\to$ ".c.") - 第二次询问后: $f($....$) = 3$("\[..\].." $\to$ "\[..\]." $\to$ "\[..\]" $\to$ ".") - 第三次询问后: $f($ .a.. $) = 1$(".a\[..\]" $\to$ ".a.") - 第四次询问后: $f($ aa.. $) = 1$("aa\[..\]" $\to$ "aa.") 由 ChatGPT 5 翻译