斐波那契字符串_KMP
前言:通过这道题恶补了一下字符串匹配的知识
思路:首先就是求出菲波那切字符串,这个很简单,但是要注意递归超时的问题,可以考虑加上备忘录,或者用递推法,接下来就是匹配问题了,常规的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的更多相关文章
- 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP
LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...
- KI的斐波那契_DFS
Description KI十分喜欢美丽而优雅的斐波那契数列,最近他新认识了一种斐波那契字符串,定义如下 f (0) = b, f (1) = a, f (2) = f (1) + f (0) = a ...
- zstuoj 4245 KI的斐波那契
KI的斐波那契 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 550 Solved: 208 Description KI十分喜欢美丽而优雅的斐波那 ...
- 力扣题目汇总(重复N次元素,反转字符串,斐波那契数)
重复 N 次的元素 1.题目描述 在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次. 返回重复了 N 次的那个元素. 示例 1: 输入:[1,2,3,3] 输出:3 ...
- HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)
题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 ...
- 洛谷P1755 斐波那契的拆分
题目背景 无 题目描述 已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法 输入输出格式 输入格式: 一个数t,表示有t组数据 接下来t行,每行一个数n(如题) 输出格式: t ...
- hdu-5686 Problem B(斐波那契数列)
题目链接: Problem B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDOJ/HDU 5686 Problem B(斐波拉契+大数~)
Problem Description 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种 ...
- python-Day4-迭代器-yield异步处理--装饰器--斐波那契--递归--二分算法--二维数组旋转90度--正则表达式
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
随机推荐
- UMP系统功能 读写分离
- LINUX挂接UNIX系统NFS文件共享
类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍 ...
- Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ...
- eclipse变量名自动补全
对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...
- MSI右键添加管理员运行.reg
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Msi.Package\shell\runas]@="右键以管理员运行MSI& ...
- java.sql.SQLException
java.sql.SQLException 出错:java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource[ identityT ...
- 深入浅出 Java Concurrency (28): 线程池 part 1 简介[转]
从这一节开始正式进入线程池的部分.其实整个体系已经拖了很长的时间,因此后面的章节会加快速度,甚至只是一个半成品或者简单化,以后有时间的慢慢补充.完善. 其实线程池是并发包里面很重要的一部分,在实际情况 ...
- 使用xshell远程连接到linux
1.检查是否安装ssh rpm -qa | grep ssh 已安装是这样 如果没有安装,则 yum install openssh* #命令安装 2.开启ssh服务 [root@localhos ...
- 《DSP using MATLAB》Problem 7.35
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- Activiti历史查看
流程执行完毕后,究竟去了哪里有些疑问. 虽然已完成的任务在act_ru_task和act_ru_execution表中都已被删除,但是这些数据还存在activiti的数据库中,作为历史改由Histor ...