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. Django 中的Form表单认证

    一.Form表单   1.1 Form的几个功能 验证用户数据(显示错误信息) 初始化页面显示内容 HTML Form提交保留上次提交数据 生成HTML标签   1.2 创建表单类Form 1. 创建 ...

  2. 如何使用 Docker 来限制 CPU、内存和 IO等资源?

    如何使用 Docker 来限制 CPU.内存和 IO等资源?http://www.sohu.com/a/165506573_609513

  3. hive权限配置

    基于CDH5.x的Hive权限配置 1.打开权限控制,默认是没有限制的 set hive.security.authorization.enabled=true; 2.配置默认权限 hive.secu ...

  4. AJAX+springmvc遇到的问题

    当我使用AJAX将表单的值传入处理器中后,经过了一个判断再进行页面跳转时,不能在处理器中使用重定向,它会将重定向的页面内容在AJAX的data中显示出来而不是显示一个页面 所以只能在AJAX 的suc ...

  5. rbac组件引用

    一. 批量操作思路 # 待新增 路由系统中有,但是数据库中还没有 路由系统的集合 - 数据库中权限集合 # 待更新 路由系统中有,数据库中也有, 只是更改了一些信息 路由系统的集合 & 数据库 ...

  6. PHP的特质Trait使用

    参考: Trait的使用,网站地址https://www.jianshu.com/p/fc053b2d7fd1

  7. 莫烦sklearn学习自修第八天【过拟合问题】

    1. 什么是过拟合问题 所谓过拟合问题指的是使用训练样本进行训练时100%正确分类或规划,当使用测试样本时则不能正确分类和规划 2. 代码实战(模拟过拟合问题) from __future__ imp ...

  8. 初识GetMapping(""),使用方法

    GetMapping("value = /SF/{x_num}")与GetMapping("/SF/{x_num}")通过POSTMAN获得的值一样. 注意:G ...

  9. Ubuntu16.04 启动纯文本界面方法

    问题: Ubuntu16.04 如何启动纯文本界面. 解决方法: 1.系统启动后,在登陆界面点击Ctrl+Shift+F1切换到文本登陆界面: 2.修改为默认从文本界面登陆: sudo vi /etc ...

  10. jQuery AJAX获取JSON数据解析多种方式示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...