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

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


了解详情 >

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

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

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

数据范围 s250000|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) 表示 1i1\sim i 这一段子串操作所得到的 ff 值,gig_i 表示 1i1\sim i 操作后的指针位置。考虑在末尾加入一个字符 cc,如果 cc'+''-',那显然 {fi(x)=fi1(x)±xgigi=gi1\begin{cases}f_i(x)=f_{i-1}(x)\pm x^{g_i}\\g_i=g_{i-1}\end{cases},同理如果 cc'<''>',那显然 {fi(x)=fi1(x)gi=gi11\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)fl1(x)xgl1\frac{f_r(x)-f_{l-1}(x)}{x^{g_{l-1}}}

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

代码

评论