题意
(1,2,3,4,5,6,7,8,9)为好的;若(xge 10)(令(y=x/10)),其是好的,当且仅当(y)是好的,且(x\%10<rk_{y}\%11)
(rk_y)为(y)在所有的好数中的大小排名
给定字符串(S),求(S)的所有子串有多少个是好的。
(|S|le 10^5)
做法
观察1:一个数是好的,则所有前缀均为好的
则我们仅需求得以(l)为左端点的极长串
令(f_{i,d})为以(i)为左端点,若左边加上(d),右端点极为(i+f_{i,d}-1),即(d,s_i,s_{i+1},...,s_{i+f_{i,d}-1})为极长好串
可是我们会发现这样转移不了,因为必是靠(f_{i+1})转移而来,而描述数字(d)甚是不便
定义1:对于好数(x,y),若(frac{y}{10}=x),则称(y)是由(x)扩展出来的,即(x)右侧添加一个数得到(y)
观察2:一个好数(x),能扩展出多少数,只关乎于(rk_x\%11),且(x)能扩展出(rk_x\%11\%10)
这个建议手玩一下
结论1:令(rk_x)表示(rk_x\%11),则(rk_x=(frac{rk_{frac{x}{10}}(rk_{frac{x}{10}}-1)}{2}+(x\%10+1)+9)\%11(xge 10))
证明:
排名分别在([1,11],[12,22][23,33]...)能扩展出来的数均为(55),(\%11=0)
则只有零项((rk_frac{x}{10}-1)\%11)这几个扩展出来的数有贡献,为(frac{rk_{frac{x}{10}}(rk_{frac{x}{10}}-1)}{2})
而(rk_{frac{x}{10}})扩展的数(le x)的个数为(x\%10+1)
再加上初始的无需扩展的数为(1sim 9),为(9)个
对于(s[i...j]),其右边能扩展的数,之与(rk_{s[i...j]}\%11)有关
考虑(s_{i},s_{i+1}),
则我们重新定义(f_{i,d})为以i为左端点,若左边加上排名(\%11=d)后的极右端点