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. h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃

    DeviceMotionEven是html5提供的一个用来获取设备物理方向及运动的信息(比如陀螺仪.罗盘及加速计)的Dom事件,事件描述如下: deviceorientation:提供设备的物理方向信 ...

  2. hbase2.1.9 centos7 完全分布式 搭建随记

    hbase2.1.9 centos7 完全分布式 搭建随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭配其他博 ...

  3. POJ 3263 Tallest Cow 题解

    题目 FJ's \(N (1 ≤ N ≤ 10,000)\) cows conveniently indexed 1..N are standing in a line. Each cow has a ...

  4. sql语句-CASE WHEN用法详解

    当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了. Case具有两种格式.简单Case函数和Case搜索函数. 第一种 格式 : 简单C ...

  5. 攻防世界-新手篇(Mise)~~~

    Mise this_is_flag 签到题flag{th1s_!s_a_d4m0_4la9} pdf 打开图片,flag值在图片底下,wps将pdf转为word格式后,将图片拉开发现flag flag ...

  6. 一文读懂对抗生成学习(Generative Adversarial Nets)[GAN]

    一文读懂对抗生成学习(Generative Adversarial Nets)[GAN] 0x00 推荐论文 https://arxiv.org/pdf/1406.2661.pdf 0x01什么是ga ...

  7. 使用位运算、值交换等方式反转java字符串-共四种方法

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

  8. Reface.AppStarter 基本示例

    Reface.AppStarter 向应用层提供以下几项 核心 功能 以模块化组织你的应用程序 自动注册组件至 IOC 容器 自动映射配置文件至配置类 在模块定义类中额外追加组件至 IOC 容器 在模 ...

  9. 使用 maven 创建项目模板

    前言 配置 demo 工程 生成模板 生成项目 上传模板到仓库 参看链接 前言 微服务的概念越来越流行,随着服务粒度越来越细,拆分的模块越来越明确,我们的工程项目也变得越来越多. 有时候一个项目搭建, ...

  10. 第四章:View的工作原理

    4.1 ViewRoot和DecorView ViewRoot对应于ViewRootImplement类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过Vie ...