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算法的更多相关文章

  1. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  2. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

  3. BM算法详解

    http://www-igm.univ-mlv.fr/~lecroq/string/node14.html http://www.cs.utexas.edu/users/moore/publicati ...

  4. Boyer-Moore(BM)算法,文本查找,字符串匹配问题

    KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历 ...

  5. Berlekamp_Massey 算法 (BM算法) 学习笔记

    原文链接www.cnblogs.com/zhouzhendong/p/Berlekamp-Massey.html 前言 BM算法用于求解常系数线性递推式. 它可以在 $O(n^2)$ 的时间复杂度内解 ...

  6. 【算法】BM算法

    目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...

  7. 数据结构 BM算法

    BM算法是比KMP算法更快的字符串模式匹配算法.BM算法最好情况下的时间复杂度是O(n),KMP算法最好情况下的时间复杂度是O(n+m),两者最坏情况下的时间复杂度均是O(m*n).其中,n指目标串长 ...

  8. BM算法--串匹配

    BM(Boyer-Moore)算法,后缀匹配,是指模式串的比较从右到左,模式串的移动也是从左到右的匹配过程,一般情况比KMP算法要快.时间复杂度O(m/n) C++描述(教师版) int BM(cha ...

  9. BoyerMoore(BM)算法--C#

    因项目需要使用字符串查询算法,在网上搜搜了半天,没有找到C#版的. 索性根据BM机制,用C#实现了一遍.现在贴出了,以备忘记. /// <summary> /// BM算法 /// < ...

随机推荐

  1. ios 后台下载,断点续传总结

    2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...

  2. RESTful架构详解

    什么是REST REST全称是Representational State Transfer,中文意思是表述性状态转移,它首次出现在2000年Roy Fielding的博士论文中.Roy Fieldi ...

  3. Azure系列2.1.12 —— CloudBlobDirectory

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  4. bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法

    bootstrap的modal中,使用remote可以动态加载页面到modal-body中,并弹窗显示 如果提供的是 URL,将利用 jQuery 的 load 方法从此 URL 地址加载要展示的内容 ...

  5. .Net MVC4 log4net的配置

    一.首先在使用log4net记录日志的时候,我们要引用log4net.dll文件 二.在web.config中添加一下配置代码 <configSections> <!-- For m ...

  6. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class cn.edu.

    详细信息   https://www.cnblogs.com/xuwenjin/p/8832522.html 解决办法: 在实体类上面加上注解 @JsonIgnoreProperties(value ...

  7. @Param注解

    关于mybatis的@Param注解和参数 引用 https://www.cnblogs.com/whisper527/p/6568028.html 薇飘意 1,使用@Param注解 当以下面的方式进 ...

  8. 运维常用mysql语句

    1..select @@version; ##查询当前mysql的版本. 2. show variables like 'port';##查看mysql实例的端口. 3.show variables ...

  9. mvn clean deploy

    如果是 mthrift的话,需要部署,就用 mvn clean deploy; 先进入  cd qcs.appeal.client ,然后执行:mvn clean deploy;

  10. python数据结构与算法第六天【栈与队列】

    1.栈和队列的原理 栈:后进先出(LIFO),可以使用顺序表和链表实现 队列:先进先出(FIFO),可以使用顺序表和链表实现 2.栈的实现(使用顺序表实现) #!/usr/bin/env python ...