题意
令(a[i...j])为字符串(a)单独拉([i,j])组成的数字
给定(l,r,n),求一个(n)位数,可能有前导(0),求(sumlimits_{1le ile jle n}a[i...j]in[l,r])。((1le lle rle 100^{800},nle 2000))
做法
考虑一个暴力:
将([l,r])拉出来建AC自动机,令(f_{i,u})为到达(u)点,此时长度已为(i),合法字段的最大个数,(f_{i,u}+dep_{v}longrightarrow f_{i+1,v})
其中(dep_v)为(v)在fail树上的深度
令这个自动机为原自动机。
考虑减少AC自动机上的节点数,有许多位置是之后不受限制了。比如(l=12345,r=30000),当做到(x=13???),后面三个问号是可以随意选择的。
然后将这些节点放到AC自动机上(这里强烈建议看代码,说不太清...)
然后令(g_{u,l})表示到达(u)点时,后面填任意长度为(l)的数字,都在原自动机上合法。初始化可以在建自动机的时候搞出来。
然后再通过累加fail树祖先的,得以完善
(f_{i,u}+sumlimits_{j=0}^{n-(i+1)}g_{v,j}longrightarrow f_{i+1,v})
题外话
这题本身并不难,但思路偏了几次,浪费的时间就很长