CF1142D

题意

\(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\)后的极右端点

\[\begin{aligned} &dp_{i,j}=dp_{i+1,(\frac{j(j-1)}{2}+s_i+10)\%10}+1&s_i<j\\ &dp_{i,j}=0,&s_i\ge j \end{aligned}\]

posted @ 2020-05-20 13:08  Grice  阅读(145)  评论(0编辑  收藏  举报