CF1110H

题意

\(a[i...j]\)为字符串\(a\)单独拉\([i,j]\)组成的数字
给定\(l,r,n\),求一个\(n\)位数,可能有前导\(0\),求\(\sum\limits_{1\le i\le j\le n}a[i...j]\in[l,r]\)。(\(1\le l\le r\le 100^{800},n\le 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}+\sum\limits_{j=0}^{n-(i+1)}g_{v,j}\longrightarrow f_{i+1,v}\)

题外话

这题本身并不难,但思路偏了几次,浪费的时间就很长

猜你喜欢

转载自www.cnblogs.com/Grice/p/12913761.html