题意
\(1,2,3,4,5,6,7,8,9\)为好的;若\(x\ge 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(x\ge 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\)
再加上初始的无需扩展的数为\(1\sim 9\),为\(9\)个
对于\(s[i...j]\),其右边能扩展的数,之与\(rk_{s[i...j]}\%11\)有关
考虑\(s_{i},s_{i+1}\),
则我们重新定义\(f_{i,d}\)为以i为左端点,若左边加上排名\(\%11=d\)后的极右端点