抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

有一段标号从 −∞-\infty 到 +∞+\infty 的序列 AA,初始是 Ai=0A_i=0。现在有一个人在 00 位置,有一段操作序列 ss,依次进行操作。

假设 ii 时刻这个人在位置 pp,如果 sis_i 是 '+',则将 ApA_p 加 11,如果是 '-',则减 11;如果是 '<' 则该人左移一格,否则是 '>' 则右移一格。

要求数出 ss 的所有连续子串中最终得到的 AA 与 ss 最终得到相同 AA 序列的个数。

数据范围 ∣s∣≤250000|s|\le 250000。

考虑构造一波类似生成函数的东西 f(x)=∑i=−∞+∞Aixif(x)=\sum_{i=-\infty}^{+\infty}A_ix^i,另外还有一个指针 gg,开始是 gg 指向 00 位置,显然初始时 f(x)=0f(x)=0。

我们令 fi(x)f_i(x) 表示 1∼i1\sim i 这一段子串操作所得到的 ff 值,gig_i 表示 1∼i1\sim i 操作后的指针位置。考虑在末尾加入一个字符 cc,如果 cc 是 '+' 或 '-',那显然 {fi(x)=fi−1(x)±xgigi=gi−1\begin{cases}f_i(x)=f_{i-1}(x)\pm x^{g_i}\\g_i=g_{i-1}\end{cases},同理如果 cc 是 '<' 或 '>',那显然 {fi(x)=fi−1(x)gi=gi−1∓1\begin{cases}f_i(x)=f_{i-1}(x)\\g_i=g_{i-1}\mp 1\end{cases}。

如果要计算 [l,r][l,r] 的 ff 值,不难发现就是 fr(x)−fl−1(x)xgl−1\frac{f_r(x)-f_{l-1}(x)}{x^{g_{l-1}}}。

于是我们要算的就是 fn(x)=fr(x)−fl−1(x)xgl−1f_n(x)=\frac{f_r(x)-f_{l-1}(x)}{x^{g_{l-1}}},考虑随便选一个 xx,算出这个多项式的值然后哈希一下即可。

代码

评论