P12246 电 van

Posted on 2025-04-19 18:40  K_J_M  阅读(7)  评论(0)    收藏  举报

P12246 电 van

题目描述

小 O 非常爱去电 \(\texttt{van}\) 城,所以他对 \(\texttt{van}\) 这个字符串非常的感兴趣,于是他出了一道和 \(\texttt{van}\) 有关的字符串题。

给你一个长度为 \(n\) 的字符串 \(s\),保证 \(s\)\(\texttt{v}\)\(\texttt{a}\)\(\texttt{n}\) 三种字符构成,设 \(s_i\) 表示 \(s\) 的第 \(i\) 个字符。

接下来小 O 会给你 \(m\) 次操作,每次操作给出一个整数 \(x(1\le x\le n-1)\),表示你需要交换 \(s_x\)\(s_{x+1}\)

在每次操作结束后,你需要输出字符串中 \(\texttt{van}\) 作为子序列的出现次数。

Solution

异常简单。

首先看如果我们不操作要求字符串 \(s\) 的答案怎么求。

我们固定 \(s\) 中的一个 \(\texttt{a}\),发现左边的 \(\texttt{v}\) 以及右边的 \(\texttt{n}\) 可以和它构成一组 \(\texttt{van}\),我们对 \(s\) 求两个前缀和 \(pre_{i,0/1}\) 分别表示 \(\texttt{v},\texttt{n}\) 的个数。那么我们一开始的答案就是

\[\sum_{s_i=\texttt{a}}pre_{i,0}\times(pre_{n,1}-pre_{i,1}) \]

下面我们看每一次操作对答案的影响

首先如果 \(s_x=s_{x+1}\),那么答案不变。

\(s_x=\texttt{v},s_{x+1}=\texttt{n}\) 时,答案也不变,但是前缀和数组需要改变,\(pre_{x,0}-1,pre_{x,1}+1\),反之同理可得。

\(s_x=\texttt{v},s_{x+1}=\texttt{a}\) 时,前缀和数组 \(pre_{i,0}-1\),此时这一个 \(\texttt{v}\) 移动到 \(\texttt{a}\) 的右边,意味着右边的 \(\texttt{n}\) 与这个 \(\texttt{v}\) 原先构成的 \(\texttt{van}\) 消失了,即答案减少了 \(pre_{n,1}-pre_{x,1}\),反之同理可得。

\(s_x=\texttt{n},s_{x+1}=\texttt{a}\) 时,类似的,我们可以得到 \(pre_{x,1}-1\),答案加上 \(pre_{x,0}\),反之同理可得。

这样我们就做到了时间复杂度为 \(\mathcal O(n+m)\)

代码不放了。