前言:通过这道题恶补了一下字符串匹配的知识

思路:首先就是求出菲波那切字符串,这个很简单,但是要注意递归超时的问题,可以考虑加上备忘录,或者用递推法,接下来就是匹配问题了,常规的BF会超时,所以要用KMP,

下面的代码综合了这两种方法,就当做是一个复习,。。

 #include<bits/stdc++.h>

 using namespace std;
string a[];
string array[];
int num[];
int num1[];
long long int m2=;
int next[];
string f(int k)//递归法加备忘录
{
if(k==) return "a";
if(k==) return "b";
if(k>) {
if(a[k-]==""){
a[k-]=f(k-);
}
if(a[k-]=="")
{
a[k-]=f(k-);
}
a[k] = a[k-]+a[k-];
return a[k];
}
}
string f1(int k)//递推法
{
string a1="a";
string a2="b";
string a3;
while(true)
{
a3=a2+a1;
a1=a2;
a2=a3;
k--;
// m2=a3.length();
if(k<=) return a3;
}
}
void BF(string str1,int stra,string str2,int strb,int k,int pos)
{
int i=pos;
int j=;
//cout << i << strb <<"---" <<endl;
while(i<stra && j<strb){
if(str1[i]==str2[j]){
i++;
j++;
}else
{
i=i-j+;
j=;
}
}
if(j>=strb){
num[k]++;
pos=i-strb+;
if(pos<=stra-strb){
BF( str1, stra, str2, strb,k, pos);
}
}
}
void get_next(string str,int stra)
{
int i=;
next[]=;
int j=;
while(i<stra){
if(j== || str[i]==str[j]){
i++;
j++;
next[i]=j;
}else{
j=next[j];
}
}
}
int KMP(string a,int stra,string b,int strb,int k,int pos)
{
int i=pos;
int j=;
while(i<stra && j<=strb){
if(j== || a[i]==b[j-]){
i++;
j++;
}else{
j=next[j];
}
}
if(j>strb){
num1[k]++;
pos=i-strb+;
// cout << pos << " =pos" << endl;
if(pos<=stra-strb){
KMP(a,stra,b,strb,k,pos);
}
}
}
int main()
{
freopen("D:/Test/Test1.txt","r",stdin);
a[]="a";
a[]="b";
int k,m;
cin >> k >> m; memset(num,,sizeof(num));
memset(num1,,sizeof(num1));
for(int i=;i<m;i++){
cin >> array[i];
}
string str=f(k);
cout << "------使用BF算法得到的结果-------" <<endl;
for(int i=;i<m;i++){
BF(str,str.length(),array[i],array[i].length(),i,);
cout << num[i] << " "<< endl;
}
cout << "------使用KMP算法得到的结果-------" <<endl; for(int i=;i<m;i++){
get_next(array[i],array[i].length());
KMP(str,str.length(),array[i],array[i].length(),i,);
cout << num1[i] << " "<< endl;
}
return ;
}

斐波那契字符串_KMP的更多相关文章

  1. 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP

    LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...

  2. KI的斐波那契_DFS

    Description KI十分喜欢美丽而优雅的斐波那契数列,最近他新认识了一种斐波那契字符串,定义如下 f (0) = b, f (1) = a, f (2) = f (1) + f (0) = a ...

  3. zstuoj 4245 KI的斐波那契

    KI的斐波那契 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 550  Solved: 208 Description KI十分喜欢美丽而优雅的斐波那 ...

  4. 力扣题目汇总(重复N次元素,反转字符串,斐波那契数)

    重复 N 次的元素 1.题目描述 在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次. 返回重复了 N 次的那个元素. 示例 1: 输入:[1,2,3,3] 输出:3 ...

  5. HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

    题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 ...

  6. 洛谷P1755 斐波那契的拆分

    题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个数n(如题) 输出格式: t ...

  7. hdu-5686 Problem B(斐波那契数列)

    题目链接: Problem B Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) ...

  8. HDOJ/HDU 5686 Problem B(斐波拉契+大数~)

    Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种 ...

  9. python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

随机推荐

  1. Luogu P2717 寒假作业(平衡树)

    P2717 寒假作业 题意 题目背景 \(zzs\)和\(zzy\)正在被寒假作业折磨,然而他们有答案可以抄啊. 题目描述 他们共有\(n\)项寒假作业.\(zzy\)给每项寒假作业都定义了一个疲劳值 ...

  2. 即将开源 | 2亿用户背后的Flutter应用框架Fish Redux

    背景 在闲鱼深度使用 Flutter 开发过程中,我们遇到了业务代码耦合严重,代码可维护性糟糕,如入泥泞.对于闲鱼这样的负责业务场景,我们需要一个统一的应用框架来摆脱当下的开发困境,而这也是 Flut ...

  3. Python-面向对象之封装与多态

    目录 组合 什么是组合 使用组合的目的 如何使用组合 封装 什么是封装 为什么要封装 如何封装 访问限制机制 什么是访问限制机制 访问限制机制的目的 如何使用访问限制 property 什么是prop ...

  4. W: 仓库 “http://ppa.launchpad.net/levi-armstrong/qt-libraries-trusty/ubuntu xenial Release” 没有 Release 文件。

    解决办法:将对应的PPA删除掉即可 使用以下命令切换到对应PPA目录: cd /etc/apt/sources.list.dsudo rm levi-armstrong-ubuntu-qt-libra ...

  5. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

  6. js 手机号加密 中间星号表示

    var tel = String(this.memberMsg.phoneNo); var dh=tel.substr(0,3)+"******"+tel.substr(8); r ...

  7. CentOS源码安装Wireshark

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年8月25日) Wireshark为网络管理员常用的一个网络管理工具,通过使用这个软件,我们可以对本机网卡上的经过的 ...

  8. 水题两篇 Dream & Find Integer (HDU 6440/6441)

    // 出自ICPC 2018网络赛C - Dream & D - Find Integer // 对大佬来讲的水题,本菜鸡尽量学会的防爆零题... // 今晚翻看vjudge昨日任务上的C题, ...

  9. ArduinoUno和Leonardo的区别

    学习过Arduino的同学对ArduinoUno和Lenardo的不同点会有所了解,但说起具体的区别估计还是很多人答不上来,今天我们就详细解释下Arduino Uno和Leonardo的不同. 我们从 ...

  10. excel中将时间戳转换为日期格式

    将时间戳信息通常为s,将其转换的公式为: =TEXT((A1+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss")