cojs 疯狂的字符串 题解报告

首先这道题是GT考试的加强版本QAQ

 

当n<k的时候,答案显然是10^n

当n=k的时候,答案显然是10^n-1

这样就有20分辣

 

之后我们考虑k<=20的做法

显然设f(i,j)表示前i位匹配到了第j位

之后用KMP来转移就可以了

如果不用矩阵乘法优化的话时间复杂度O(n*k*10)

如果用矩阵乘法的话时间复杂度O(k^3logn)

其实就是GT考试的做法辣

这样就有50分了

 

之后我们考虑用dp来容斥

设fi表示前i位且第一次匹配的位置是[i-k+1,i]的方案

不难发现fi=m^(i-k)-sigma(fj*m^(i-k-j))-sigma(fj)

其中第一个fj保证j<=i-k

第二个fj保证[i-k+1,j]这段前缀是数字串的一个后缀

这个判定可以用哈希或者KMP解决

这其实是一个卷积形式

我们机智的构造一个多项式g来转移

之后就可以做CDQ+FFT辣

时间复杂度O(nlog^2n)

可以得到100分了

 

实际上我们移项之后可以得到

m^(i-k)=sigma(fj*gi-j)

构造多项式h

得到h=f*g,则f=h*g^(-1)

多项式求逆即可

posted @ 2016-06-19 16:53  _Vertical  阅读(275)  评论(0编辑  收藏  举报