BM算法
BM算法
用来求解一个数列的递推式。
即给定\(\{x_i\}\)求解一个\(\{a_i\}\),满足\(|a|=m,x_n=\sum_{i=1}^ma_i*x_{n-i}\)。
考虑增量法构造。
假设当前有一个长度为\(m\)的\(\{a\}\)满足条件,并且对于\(x_{1..n-1}\)都满足递推关系。
定义\(delta=\sum_{i=1}^m a_i*x_{n-i}-x_i\)。如果\(delta\)显然满足递推关系,不用管。
否则不满足,那么我们就要\(fix\)一下锅。那么我们就要找另外一个递推式\(\{b\}\),让\(i\in[1,n-1]\)的时候算出来的\(delta'\)都是\(0\),同时在\(i=n\)的时候算出来的东西是\(1\),那么乘一乘,搞一搞就可以了。
问题在于怎么找这个东西。如果当前这个不是第一次不合法,那么前面必定存在一个位置\(j\),然后在\(j\)的时候我们对于这个多项式修了一次锅,它满足了\([1,j-1]\)都是\(0\),同时\(j\)位置上有值。那么我们在前面补零,直到当前\(i\)位置的时候恰好对应到\(j\)位置上那个非\(0\)的位置,乘逆元之后,这样子恰好能够满足条件。那么把多项式加在一起就好啦。
说得好乱啊,看看代码就懂了。
模板
void BM()
{
n=read();
for(int i=1;i<=n;++i)f[i]=read();
for(int i=1;i<=n;++i)
{
delta[i]=(MOD-f[i])%MOD;
for(int j=0,l=now.size();j<l;++j)add(delta[i],1ll*f[i-j-1]*now[j]%MOD);
if(!delta[i])continue;fail[cnt]=i;
if(!cnt){now.resize(i);++cnt;continue;}
int inv=(MOD-1ll*delta[i]*fpow(delta[fail[lst]],MOD-2)%MOD)%MOD,l=pre.size();
cur.clear();cur.resize(i-fail[lst]-1);cur.push_back(MOD-inv);
for(int j=0;j<l;++j)cur.push_back(1ll*inv*pre[j]%MOD);
if(now.size()>cur.size())cur.resize(now.size());
for(int j=0,l=now.size();j<l;++j)add(cur[j],now[j]);
if(now.size()-i<pre.size()-fail[lst])lst=cnt,pre=now;
++cnt;now=cur;
}
for(int i=0,l=now.size();i<l;++i)printf("%d ",now[i]);
}
BM算法的更多相关文章
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...
- BM算法详解
http://www-igm.univ-mlv.fr/~lecroq/string/node14.html http://www.cs.utexas.edu/users/moore/publicati ...
- Boyer-Moore(BM)算法,文本查找,字符串匹配问题
KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历 ...
- Berlekamp_Massey 算法 (BM算法) 学习笔记
原文链接www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html 前言 BM算法用于求解常系数线性递推式. 它可以在 $O(n^2)$ 的时间复杂度内解 ...
- 【算法】BM算法
目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...
- 数据结构 BM算法
BM算法是比KMP算法更快的字符串模式匹配算法.BM算法最好情况下的时间复杂度是O(n),KMP算法最好情况下的时间复杂度是O(n+m),两者最坏情况下的时间复杂度均是O(m*n).其中,n指目标串长 ...
- BM算法--串匹配
BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快.时间复杂度O(m/n) C++描述(教师版) int BM(cha ...
- BoyerMoore(BM)算法--C#
因项目需要使用字符串查询算法,在网上搜搜了半天,没有找到C#版的. 索性根据BM机制,用C#实现了一遍.现在贴出了,以备忘记. /// <summary> /// BM算法 /// < ...
随机推荐
- js判断手机机型,然后进行相对应的操作
我们通过浏览器内置的userAgent来判断手机机型. 具体代码如下: var u = navigator.userAgent, app = navigator.appVersion; if(/App ...
- MySQL 查询语句中自己定义的中文内容在Java Web 中显示为问号
Java Web 端做查询时,性别字段存的是数字,1代表男,2代表女,取数据时将性别转为汉字显示在页面,sql语句如下,结果发生了问题 select a.emp_id,a.emp_name ,cas ...
- win10查看无线密码
- thymeleaf 引入公共html注意事项
详细连接https://blog.csdn.net/u010260737/article/details/83616998 每个页面都会用到分页.html或者头部.html.尾部.html,在其他页面 ...
- idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,
第一种错误 :idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml, 解决方案如下:将ma ...
- js splice vs slice
js splice vs slice https://stackoverflow.com/questions/37601282/javascript-array-splice-vs-slice htt ...
- solr安装配置(一)
本文使用的solr版本是solr-5.5.5. 步骤: 1.解压solr压缩包. 2.将solr-5.5.5\server\solr-webapp目录下面的文件拷贝到Tomcat的webapps目录下 ...
- Java使用RabbitMQ之整合Spring(消费者)
依赖包: <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.am ...
- 三、安装MyCat-Web
一.下载和解压MyCat-web http://dl.mycat.io/mycat-web-1.0/ wget http://dl.mycat.io/mycat-web-1.0/Mycat-web-1 ...
- LODOP打印安装到win的特殊字体
LODOP能够打印的字体,来源于安装到本机windows里字体库的字体,如果需要打印特别的字体,需要在该操作系统安装.由于web网站的用户千差万别,字体库也有不同,但是一般常见的字体都是有的,因此做模 ...