牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP
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的更多相关文章
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- 关于斐波那契数列的一些恒等式 模板 牛客OI测试赛 A 斐波拉契
牛客A 斐波拉契 链接:https://www.nowcoder.com/acm/contest/181/A来源:牛客网 设f[i]表示斐波那契数论的第i项 f[1]=1,f[2] =1,f[i] = ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- P1349 广义斐波那契数列(矩阵乘法)
题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...
- Cogs 1708. 斐波那契平方和(矩阵乘法)
斐波那契平方和 ★★☆ 输入文件:fibsqr.in 输出文件:fibsqr.out 简单对比 时间限制:0.5 s 内存限制:128 MB [题目描述] ,对 1000000007 取模.F0=0, ...
- Codevs 1574 广义斐波那契数列(矩阵乘法)
1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如an=p*an-1+q* ...
- [codevs]1250斐波那契数列<矩阵乘法&快速幂>
题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...
- 牛客练习赛63 牛牛的树行棋 差分 树上博弈 sg函数
LINK:牛牛的树行棋 本来是不打算写题解的. 不过具体思考 还是有一段时间的. 看完题 一直想转换到阶梯NIM的模型上 转换失败. 考虑SG函数. 容易发现 SG函数\(sg_x=max{sg_{t ...
- 4.17 斐波那契数列 K维斐波那契数列 矩阵乘法 构造
一道矩阵乘法的神题 早上的时候我开挂了 想了2h想出来了. 关于这道题我推了很多矩阵 最终推出两个核心矩阵 发现这两个矩阵放在一起做快速幂就行了. 当k==1时 显然的矩阵乘法 多开一个位置维护前缀和 ...
随机推荐
- 从Linux源码看Socket(TCP)Client端的Connect
从Linux源码看Socket(TCP)Client端的Connect 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的 ...
- 数据可视化之powerBI基础(十四)Power BI中创建联动切片器
https://zhuanlan.zhihu.com/p/67564062 进行数据分析时,每个分析维度并不总是独立的,比如省份是一个维度,城市也是一个维度,而这两个维度之间是有逻辑关系的,那么在进行 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
- 评测Loki日志工具
评测Loki日志工具 目录 评测Loki日志工具 部署Loki 配置grafana 总结: 优势: 劣势: 本文仅对Loki进行简单评测,不涉及原理和细节. 部署Loki Loki是grafana团队 ...
- windows如何解决Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion'
问题再现与解读 首次,使用 java 命令+任意参数 都会报这个错误,最典型的就是java -version 解读一下这个报错信息,注册表路径 Software\JavaSoft\Java Runti ...
- Java基础之Bridge method(桥接方法)
1.什么是桥接方法 桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法. 判断方法 我们可以通过 Method.isB ...
- CODING DevOps + Nginx-ingress 实现自动化灰度发布
作者:王炜,CODING DevOps 后端开发工程师,拥有多年研发经验,云原生.DevOps.Kubernetes 资深爱好者,Servicemesher 服务网格中文社区成员.获得 Kuberne ...
- APP自动化 -- MobileBy
一.BobileBy源码 selenium中有 By appium就有MobileBy. 二.MobileBy示例 MobileBy就是继承的By,所以,语法基本是一样的.
- Head First HTML与CSS(第2版)PDF高清完整版免费下载|百度云盘
百度云盘:Head First HTML与CSS(第2版)PDF高清完整版免费下载 提取码:i8q4 内容简介 是不是已经厌倦了那些深奥的HTML书?你可能在抱怨,只有成为专家之后才能读懂那些书.那么 ...
- SQL查询基本用法
-- 单列查询 select 编号 from employees -- 多列查询 select 编号,姓名 from employees -- 查询所有列 select * from employee ...