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. java.net.NoRouteToHostException:Cannot assign requ

    以下内容摘自:http://blog.sina.com.cn/s/blog_658c8cea0101l2sw.html 今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRoute ...

  2. CentOS云厂商清单

    Download CentOShttps://www.centos.org/download/ Download - CentOS Wikihttps://wiki.centos.org/Downlo ...

  3. Eclipse支持文件UTF-8编码

    Eclipse修改编码格式_百度经验https://jingyan.baidu.com/article/2009576193ee38cb0721b416.html 这篇最棒 如何为eclipse中的文 ...

  4. MySQL设计SQL语句优化规范

    原文:http://bbs.landingbj.com/t-0-240751-1.html 1. 使用mysql explain 对sql执行效率进行检测 ,explain显示了mysql如何使用索引 ...

  5. Vagrant系列(二)----Vagrant的配置文件Vagrantfile详解

    一.简介 在我们的工作目录下有一个Vagrantfile文件,里面包含有大量的配置信息,通过它可以定义虚拟机的各种配置,如网络.内存.主机名等,主要包括三个方面的配置,虚拟机的配置.SSH配置.Vag ...

  6. CLOUD SQL跟踪

    CLOUD会自动在后台执行一些sql语句,所以追踪起来比较麻烦,需要加入一些过滤条件. 比如关键的CLIENTPROCESSID,加入后 ,就能过滤是哪个客户度执行的数据. 过滤数据.

  7. Saltstack 安装与常用模块

    一.介绍 saltstack是基于C/S服务模式,在该架构中,服务器端叫做Master,客户端叫做Minion.传统的C/S模式我们这样理解,客户端发送请求给服务器端,服务器端接受到来自客户端的请求并 ...

  8. dashboard使用与访问

    #dashboard的github地址 https://github.com/kubernetes/dashboard #下载 wget https://raw.githubusercontent.c ...

  9. 996.ICU

    996.ICU https://github.com/996icu/996.ICU https://www.zhihu.com/question/317722302 LICENSE https://g ...

  10. Web API 如何请求基于Basic/Bearer 头的方式 C#

    public void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) { string au ...