LINK:牛牛的斐波那契字符串

虽然sb的事实没有改变 但是 也不会改变。

赛时 看了E和F题 都不咋会写 所以弃疗了。

中午又看了一遍F 发现很水 差分了一下就过了。

这是下午和古队长讨论+看题解的神仙做法的时候 突然想到的。

问题的难点在于 a和b的长度有可能是小于s的 所以递推不了 只能暴力。

暴力的背后藏着正解。可以发现当a和b的长度扩大到大于s时 容易发现 每次s匹配的 不可能横跨a b了 所以此时只有可能是a的后缀接b的后缀 或者b的后缀接a的后缀。

而这个我们可以递推式子分奇偶考虑。然后 就可以直接递推了。

题解的神仙做法是 杜教BM 不过 做法过于神仙 也没有学习的必要 所以弃疗。

直接考虑矩阵乘法 这个东西 虽然带系数不过 矩阵是可以列出的 还很容易 我列了一个\(4\cdot 4\)的。

细节比较繁琐。值得注意。

const ll MAXN=1000010;
ll n,ans,cnt=2,ww=2,d1,d2;
ll nex[MAXN],f[4],g[4];
string a[2],s,cc;
inline void KMP(string b)
{
ll j=-1;ans=0;
for(ui ll i=0;i<b.size();++i)
{
while(j!=-1&&s[j+1]!=b[i])j=nex[j];
if(b[i]==s[j+1])++j;
if(j==(ll)s.size()-1){j=nex[j];++ans;}
}
}
struct wy
{
ll a[4][4];
wy(){memset(a,0,sizeof(a));}
inline wy friend operator *(wy a,wy b)
{
wy c;
rep(0,3,i)rep(0,3,j)rep(0,3,k)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return c;
}
inline wy friend operator ^(wy a,ll p)
{
while(p)
{
if(p&1)
{
rep(0,3,i)g[i]=f[i],f[i]=0;
rep(0,3,i)rep(0,3,j)f[i]=(f[i]+a.a[j][i]*g[j])%mod;
}
p=p>>1;a=a*a;
}
return a;
}
}T;
signed main()
{
//freopen("1.in","r",stdin);
ios::sync_with_stdio(false);
cin>>n;cin>>a[0];cin>>a[1];cin>>s;
memset(nex,-1,sizeof(nex));
ll j=-1;
for(ui ll i=1;i<s.size();++i)
{
while(j!=-1&&s[j+1]!=s[i])j=nex[j];
if(s[j+1]==s[i])++j;
nex[i]=j;
}
if(n==1){KMP(a[0]);putl(ans);return 0;}
if(n==2){KMP(a[1]);putl(ans);return 0;}
ll w1=0,w2=1;//putl(ww);
while(a[0].size()<s.size()||a[1].size()<s.size())
{
a[w1]=a[w1]+a[w2];
swap(w1,w2);++ww;
if(ww==n){KMP(a[w2]);putl(ans);return 0;}
}
//求出递推常数 d1和d2.偶数为 w2+w1 奇数为w2+w2;
//cout<<a[w1]<<' '<<a[w2]<<endl;putl(ww);
ll kk=a[w2].size()-s.size()+1;
for(ui i=kk;i<a[w2].size();++i)cc+=a[w2][i];
for(ui i=0;i<s.size()-1;++i)cc+=a[w2][i];
//cout<<cc<<endl;
KMP(cc);d1=ans;cc="";//putl(ans);
for(ui i=kk;i<a[w2].size();++i)cc+=a[w2][i];
for(ui i=0;i<s.size()-1;++i)cc+=a[w1][i];
//cout<<cc<<endl;
KMP(cc);d2=ans;cc="";//putl(ans);
a[w1]=a[w1]+a[w2];++ww;
swap(w1,w2);
KMP(a[w1]);f[0]=ans;
KMP(a[w2]);f[1]=ans;
if(ww==n){putl(f[1]);return 0;}
n-=ww;f[2]=d2;f[3]=d1;
T.a[0][1]=T.a[1][0]=T.a[1][1]=T.a[2][1]=T.a[2][3]=T.a[3][2]=1;
T=T^n;putl(f[1]);return 0;
}

牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP的更多相关文章

  1. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  2. 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契

    牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...

  3. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  4. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

  5. Cogs 1708. 斐波那契平方和(矩阵乘法)

    斐波那契平方和 ★★☆ 输入文件:fibsqr.in 输出文件:fibsqr.out 简单对比 时间限制:0.5 s 内存限制:128 MB [题目描述] ,对 1000000007 取模.F0=0, ...

  6. Codevs 1574 广义斐波那契数列(矩阵乘法)

    1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...

  7. [codevs]1250斐波那契数列<矩阵乘法&快速幂>

    题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...

  8. 牛客练习赛63 牛牛的树行棋 差分 树上博弈 sg函数

    LINK:牛牛的树行棋 本来是不打算写题解的. 不过具体思考 还是有一段时间的. 看完题 一直想转换到阶梯NIM的模型上 转换失败. 考虑SG函数. 容易发现 SG函数\(sg_x=max{sg_{t ...

  9. 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造

    一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...

随机推荐

  1. 石子合并——区间dp

    石子合并(3种变形) <1> 题目: 有N堆石子排成一排(n<=100),现要将石子有次序地合并成一堆,规定每次只能选相邻的两堆合并成一堆,并将新的一堆的石子数,记为改次合并的得分, ...

  2. 「JLOI2015」城池攻占 可并堆

    传送门 分析 如果直接暴力枚举的话肯定会超时 我们可以从下往上遍历,维护一个小根堆 每次到达一个节点把战败的骑士扔出去 剩下的再继续向上合并,注意要维护一下其实的战斗力 可以像线段树那样用一个lazy ...

  3. chrome本地调试跨域问题

    1.关闭chrome浏览器(全部) 我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xia ...

  4. django框架效率

    1. django ORM模式提供食物处理类:transaction.Django默认的事务处理方式时改动就提交,每执行一次就立即提交,这就会花费大量的时间用于IO.Django也支持所有工作都完成后 ...

  5. 从0开始,手把手教你开发并部署上线一个知识测验微信小程序

    上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...

  6. djangorestframework学习1-通过HyperlinkedModelSerializer,ModelViewSet,routers编写第一个接口

    前提首先安装了django,安装方式:pip install django 1. djangorestftamework安装: pip install djangorestframework 2. 创 ...

  7. java 基本语法(八) 数组(一) 数组的概述

    * 1.数组的理解:数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名, * 并通过编号的方式对这些数据进行统一管理. * * 2.数组相关的概念: * >数组名 * ...

  8. 数据可视化之powerBI基础(十二)PowerBI导入Excel数据有哪几种方式?

    https://zhuanlan.zhihu.com/p/64999937 Excel作为使用最频繁.应用最广泛.用户最庞大的数据处理工具,当然也应该是PowerBI最常用的数据获取方式,本文介绍一下 ...

  9. 数据分析04 /基于pandas的DateFrame进行股票分析、双均线策略制定

    数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 目录 数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 需求1:对茅台股票分析 需求2 ...

  10. 数据清洗与准备知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片.