CC's

Back

给一个字符串,现有这么一种操作,将字符串内每一个字母替换成一给定字符串。例如Ta=abc,Tb=eeT_a=abc,T_b=ee,那么abab就会被替换成abceeabcee

给出初始的字符串SS,和26个字母所对应的字符串TiT_i,应用操作KK次,询问第ii个位置的字符。

S1000000|S| \leq 1000000

2Ti50,K10152 \leq |T_i| \leq 50,K \leq 10^{15}

分析#

头秃。开始以为关键是在于数出一个字符串经过K次操作后达到的长度,然后然后用类似于二分的方法去递归地分层找到需要的位置。于是就统计每个字母的数目,用矩阵快速幂拿到长度……

现在看着过于智障。这1e15的指数和1e15的下标,你怎么敢快速幂。

由替换字符串的长度可以得到,这种操作顶多执行50次(2502^{50})。因此字符串的长度部分计算实际上不占大头,用个倍增就能处理出来。

现在剩下的问题是操作次数KK过大。方法仍然是基于50次。一个字符扩展50次,就足够把所有的询问包含在内。因此要计算出第一个字符替换的循环节,将操作次数降到接近50。此后通过倍增法去一层层定位询问下标所处的位置。

最开始方向错了是一码事…感觉K的范围也挺无聊的…代码等到之后再补上。

代码#

实际实现时,降K可能浮动26左右,所以多处理这么一点。

Prolonged Password
https://astro-pure.js.org/blog/kattis-prolonged-password
Author Cheng Chen
Published at 2020年4月8日
Comment seems to stuck. Try to refresh?✨