码迷,mamicode.com
首页 > Web开发 > 详细

cojs 疯狂的字符串 题解报告

时间:2016-06-19 18:12:34      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

首先这道题是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)

多项式求逆即可

cojs 疯狂的字符串 题解报告

标签:

原文地址:http://www.cnblogs.com/joyouth/p/5598332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!