kmp算法题全套svp版
题目链接
1.A - Number Sequence
2.B - Oulipo
3.C - 剪花布条
4.D - Cyclic Nacklace
5.E - PeriodE - Period
6.F - Power Strings
7.G - Seek the Name, Seek the Fame
8.H - Blue Jeans
9.I - Simpsons’ Hidden Talents
10.J - Count the string
11.K - Clairewd’s message
12.L - Substrings
做个总结
代码块上
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
int b[20005];
int a[2000005],f[2000005];
int m,n;
void fc()
{f[0]=f[1]=-1;for(int i=1;i<m;i++){ int j=f[i-1];while((j>=0)&&(b[j+1]!=b[i])){j=f[j];}if(b[j+1]==b[i]){f[i]=j+1;}else{f[i]=-1;}}}
int kmp()
{int i=0;int j=0;while(i<n){if(a[i]==b[j]){i++;j++;if(j==m){return i-m+1;}}else{if(j==0){i++;}else{j=f[j-1]+1;}}}return -1;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d",&n);scanf("%d",&m);for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int j=0;j<m;j++){scanf("%d",&b[j]);}// memset(f,0,sizeof(f));fc();printf("%d\n",kmp());}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[20005],a[2000005];
int f[2000005];void fc()
{int k,m,p;k=strlen(b);f[0]=f[1]=-1;for(int i=1;i<k;i++){int j=f[i-1];while((j>=0)&&(b[j+1]!=b[i])){j=f[j];}if(b[j+1]==b[i]){f[i]=j+1;}else{f[i]=-1;}}}
int kmp()
{int sum=0;int i=0;int j=0;int k=strlen(a);int m=strlen(b);while(i<k){if(a[i]==b[j]){i++;j++;if(j==m){sum++;}}else{if(j==0){i++;}else{j=f[j-1]+1;}}}return sum;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf(" %s",b);scanf(" %s",a);//memset(f,0,sizeof(f));fc();printf("%d\n",kmp());}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[20005],a[2000005];
int f[2000005];void fc()
{int k;k=strlen(b);f[0]=f[1]=-1;for(int i=1;i<k;i++){int j=f[i-1];while((j>=0)&&(b[j+1]!=b[i])){j=f[j];}if(b[j+1]==b[i]){f[i]=j+1;}else{f[i]=-1;}}}
int kmp()
{int sum=0;int i=0;int j=0;int k=strlen(a);int m=strlen(b);while(i<k){if(a[i]==b[j]){i++;j++;if(j==m){sum++;}}else{if(j==0){i++;}else{j=0;}}}return sum;
}
int main()
{// int t;
// scanf("%d",&t);while(1){scanf(" %s",a);if(a[0]=='#'){break;}scanf(" %s",b);//memset(f,0,sizeof(f));fc();printf("%d\n",kmp());}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[2000005],a[2000005],c[2000005];
int f[2000005];void fc(int l)
{int j=-1;f[0]=-1;for(int i=0;i<l;){if(j==-1||b[j]==b[i])//此时f表示达到另一个重复节之前的个数{f[++i]=++j;}else{j=f[j];}}}
//int kmp()
//{// int sum=0;
// int i=0;
// int j=0;
// int k=strlen(a);
// int m=strlen(b);
// while(i<k)
// {// if(a[i]==b[j])
// {// i++;
// j++;
// if(j==m)
// {// sum++;
//
//
// }
// }
// else
// {// if(j==0)
// {// i++;
// }
// else
// {// j=int k=strlen(a);0;
// }
//
// }
// }
// return sum;
//}
int main()
{int t;scanf("%d",&t);while(t--){scanf(" %s",b);int k=strlen(b);
// for(int i=0;i<k;i++)
// {// b[i]=a[i];
// a[i+k]=a[i];
// }
// if(a[0]=='#')
// {// break;
// }
// scanf(" %s",b);//memset(f,0,sizeof(f));fc(k);int le=k-f[k];if(le!=k&&k%le==0){printf("0\n");}else printf("%d\n",le-k%le);}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[2000005],a[2000005],c[2000005];
int f[2000005];
int m,n;
void fc(int l)
{f[0]=f[1]=-1;for(int i=1;i<l;i++){//其实还是指针int j=f[i];//j表示连续重复个数while(j!=-1&&b[i]!=b[j+1]){j=f[j+1];}if(b[i]==b[j+1]){f[i+1]=j+1;}else{f[i+1]=-1;}}}
int kmp()
{}int main()
{int w=1;while(1){scanf("%d",&n);if(n==0){break;}scanf(" %s",b);fc(n);printf("Test case #%d\n",w++);// w++;for(int i=2;i<=n;i++){int _length=i-f[i]-1;//最小循环节if(f[i]>-1&&(i%_length==0))printf("%d %d\n",i,i/_length);}printf("\n");}return 0;
}```cpp
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[2000005],a[2000005],c[2000005];
int f[2000005];
int m,n;
void fc(int l)
{f[0]=f[1]=-1;for(int i=1;i<l;i++){//其实还是指针int j=f[i];//j表示连续重复个数while(j!=-1&&b[i]!=b[j+1]){j=f[j+1];}if(b[i]==b[j+1]){f[i+1]=j+1;}else{f[i+1]=-1;}}}
int kmp()
{}int main()
{// int w=1;while( scanf(" %s",b)==1){int k;if(b[0]=='.'){break;}k=strlen(b);fc(k);int _length=k-f[k]-1;if(f[k]>-1&&(k%_length==0)){printf("%d\n",k/_length);}else{printf("1\n");}// printf("Test case #%d\n",w++);// w++;
// for(int i=2;i<=n;i++)
// {// int _length=i-f[i]-1;//最小循环节
// if(f[i]>-1&&(i%_length==0))
// printf("%d %d\n",i,i/_length);
//
// }// printf("\n");}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
char b[2000005],a[2000005],c[2000005];
int f[2000005];
int m,n;
void fc(int l)
{int i=0;int j=-1;f[0]=-1;while(i<=l)//循环节大小和一些规律都在其中{if(j==-1||b[j]==b[i]){f[++i]=++j;}else{j=f[j];}}}
int kmp()
{}
vector<int> q;
int main()
{while(scanf(" %s",b)!=EOF){int k=strlen(b);fc(k);while(k>0){q.push_back(k);k=f[k];}int l=q.size();for(int i=l-1;i>=0;i--){printf("%d ",q[i]);}printf("\n");q.clear();}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
int f[200005];
char d[15][65],*kk;
int m,n;
void fc(char *p ,int l) //这里数组传参char和string有区别string传参内容不会变而char会变 传参都是传的地址
{int i=0;int j=-1;f[0]=-1;while(i<l){if(j==-1||p[i]==p[j]){f[++i]=++j;}else{j=f[j];}}}
bool kmp(char *p1,int l1,char *p2,int l2)
{//printf("%s\n",p2);int i=0;int j=0;while(i<l1){if(j==-1||p1[i]==p2[j]){++i;++j;}else{j=f[j];}if(j==l2){// printf("\n yes \n");return true;}}return false;
}//vector<int> q;int main()
{//ios::sync_with_stdio(false);取消同步加速cout cin。但此处我使用麻烦的scanf cin.tie(0);int t;int w;scanf("%d",&t);while(t--){memset(d,'\0',sizeof(d));scanf("%d",&w);for(int i=0;i<w;i++){scanf("%s",d[i]);}char ans[65],*hh;memset(ans,'\0',sizeof(ans));int lo=strlen(d[0]);for(int i=0;i<lo;i++){for(int j=1;i+j<=lo;j++){char res[65];memset(res,'\0',sizeof(res));for(int ii=0;ii<j;ii++){res[ii]=d[0][ii+i];}//复制字串从i开始hh=res;int ppo=strlen(res);fc(hh,ppo);bool flag=false;//printf("%d",flag);for(int k=1;k<w;k++){kk=d[k];int opo=strlen(d[k]);if(!kmp(kk,opo,res,ppo)){flag=true;// break;// printf("nnnnnnnnnooooooo\n");}}//printf("%d",flag);if(!flag){int iiop=strlen(ans);// printf(" *** %d ***\n ",ppo);if(iiop<ppo){for(int pp=0;pp<ppo;pp++){ans[pp]=res[pp];}}else if(iiop==ppo){//printf("\n %d \n",iiop);if(strcmp(ans,res)>0){for(int pp=0;pp<ppo;pp++){ans[pp]=res[pp];}}}}}memset(f,'\0',sizeof(f));// printf( " ********* %d ********",iiop);}if(strlen(ans)<3){printf("no significant commonalities\n");}else{for(int i=0;i<strlen(ans);i++){printf("%c",ans[i]);}printf("\n");}}return 0;
}
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<sstream>
#include<fstream>
#include<vector>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<queue>
#include<string>
#include<string.h>
using namespace std;
//char a[500005];
//char b[500005];
//int f[500005];
//void fc(int l)
//{// int i=0;
// int j=-1;
// f[0]=-1;
// while(i<l)
// {// if(j==-1||a[i]==a[j])
// {// f[++i]=++j;
//
// }
// else
// {// j=f[j];
// }
//
// }
//}
//int kmp(int l)
//{// int j=-1;
// for(int i=0;i<l;i++)
// {// while (j>=0&&b[i]!=a[j+1])
// {// j=f[j];
// }
// if(b[i]==a[j+1])
// {// j++;
// }
// if(i==l-1)
// return j;
// }
// return 0;
//}
//int main()
//{// while(scanf("%s%s",a,b)!=EOF)
// {// int q=strlen(a);
// int p=strlen(b);
// fc(q);
// int w=kmp(p)+1;
// if(w!=0)
// for(int i=0;i<w;i++)
// {// printf("%c",a[i]);
//
// }
// if(w==0)
// printf("0\n");
// else
// printf(" %d\n",w);
//
//
//
//
//
// memset(a,'\0',sizeof(a));
// memset(b,'\0',sizeof(b));
// memset(f,0,sizeof(f));
// }
//
// return 0;
//}
char a[500005],b[500005];
char c[1000010];
int f[1000010];
void fc(int l)
{int i=0;int j=-1;f[0]=-1;while(i<l){if(j==-1||c[i]==c[j]){f[++i]=++j;}else{j=f[j];}}}
int main()
{while(scanf("%s%s",a,b)!=EOF){int q=strlen(a);int p=strlen(b);for(int i=0;i<q;i++){c[i]=a[i];}for(int i=q;i<p+q;i++){c[i]=b[i-q];}int k=strlen(c);int y=min(q,p);// printf("%d",y);fc(k);
// for(int i=0;i<k;i++)
// {// printf("%c",c[i]);
// }if(f[k]>0){ if(f[k]<=y){for(int j=0;j<f[k];j++)printf("%c",c[j]);printf(" %d\n",f[k]);}else{for(int j=0;j<y;j++)printf("%c",c[j]);printf(" %d\n",y);}}else{printf("0\n");}memset(a,'\0',sizeof(a));memset(b,'\0',sizeof(b));memset(c,'\0',sizeof(c));memset(f,0,sizeof(f));}return 0;
}
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char a[400000];
int b[400000];
int f[400000];
void fc(int l)
{int j=-1;int i=0;f[0]=-1;while(i<l){if(j==-1||a[i]==a[j]){f[++i]=++j;}else {j=f[j];}}
}
int main()
{int t;scanf("%d",&t);while(t--){int n;memset(b,0,sizeof(b));scanf("%d",&n);for(int i=0;i<n;i++){scanf(" %c",&a[i]);}fc(n);int ans=0;for(int i=1;i<=n;i++){b[f[i]]++;}for(int i=1;i<=n;i++){if(b[i]>0)ans+=b[i];ans%=10007;}ans+=n;printf("%d\n",ans%10007);memset(f,0,sizeof(f));memset(a,'\0',sizeof(a));}return 0;
}
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char a[200000],c[200000];
int b[200000];
char mm[30],shadow[30];
int key[30],ip[30];
int f[200000];
void fc(int l,int k)
{int j=-1;int i=k-1;f[0]=-1;while(i<l){if(j==-1||a[i]==a[j]){f[++i]=++j;}else {j=f[j];}}
}
int main()
{int t;scanf("%d",&t);while(t--){scanf(" %s",mm);for(int i=0;i<26;i++){shadow[i]='a'+i;// printf("%c",shadow[i]);}for(int i=0;i<26;i++){key[i]=mm[i]-'a';ip[key[i]]=i;}scanf(" %s",a);int k=strlen(a);for(int i=0;i<k;i++){b[i]=a[i]-'a';}int w=0;int pp;if(k%2==1)//优化{pp=k/2+1;}else{pp=k/2;}for(int i=0;i<pp;i++){a[i]=ip[b[i]]+'a';w++;}for(int i=pp;i<k;i++){if(a[i]==a[0]){// printf("%d",f[k]);fc(k,pp);if(f[k]>0){break;}}a[i]=ip[b[i]]+'a';w++;}for(int i=0;i<w;i++){printf("%c",b[i]+'a');}for(int i=0;i<w;i++){printf("%c",a[i]);}printf("\n");memset(b,0,sizeof(b));memset(f,0,sizeof(f));memset(a,'\0',sizeof(a));}return 0;
}
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char cw[105][105];
char ans[105];
int f[200];
void fc(char *p,int l)
{int j=-1;int i=0;f[0]=-1;while(i<l){if(j==-1||p[i]==p[j]){f[++i]=++j;}else {j=f[j];}}
}
bool kmp(char *z ,int q,int p,int po)
{int j=-1;for(int i=0;i<p;i++){while(j!=-1&&cw[q][i]!=z[j+1]){j=f[j];}if(cw[q][i]==z[j+1]){j++;}if(j==po-1){return true;}}j=-1;for(int i=p-1;i>=0;i--){while(j!=-1&&cw[q][i]!=z[j+1]){j=f[j];}if(cw[q][i]==z[j+1]){j++;}if(j==po-1){return true;}}return false;
}
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);memset(cw,'\0',sizeof(cw));memset(ans,'\0',sizeof(ans));int pp[105];for(int i=0;i<n;i++){scanf(" %s",cw[i]);pp[i]=strlen(cw[i]);if(i==0)for(int j=0;j<(int)strlen(cw[i]);j++){ans[j]=cw[i][j];}int aa=strlen(ans);if(aa>pp[i]){memset(ans,'\0',sizeof(ans));for(int j=0;j<pp[i];j++){ans[j]=cw[i][j];}}}int k=strlen(ans);int h=0;for(int i=0;i<k;i++){for(int j=1;j+i<=k;j++){char oo[105];for(int o=0;o<j;o++){oo[o]=ans[o+i];}// printf("%s\n",oo);char *l;l=oo;int ll=strlen(l);memset(f,-1,sizeof(f));fc(l,ll);bool flag=false;for(int ii=1;ii<n;ii++){if(!kmp(l,ii,pp[i],ll)){flag=true;}}if(!flag){h=max(h,j);}memset(oo,'\0',sizeof(oo));}}printf("%d\n",h);}return 0;
}
这其中我理解的kmp 是就好像指针的移动,我把next数组都简化为f数组 fc就是getnext(),在这里f数组的值前后缀匹配个数最大值和i-f[i]的值是循环节,都有特殊含义可以深入理解,利用到很多知识 ,其中由于stl学的太少了就在效率上面很吃亏。
kmp算法题全套svp版相关推荐
- UVA475 KMP算法题
分析:题意个人感觉比较难懂..英语太弱.. 大意是给定一个带有通配符的字符串,后面紧跟着列出一大堆字符串,需要你查找其中符和格式的字符串.. 根据星号所在位置对原字符串进行分割.然后通过KMP算法进行 ...
- KMP算法(C语言版)
有关字符串匹配的最有效的算法. 其算法复杂度为两个字符串的长度之和(m+n). #include <stdio.h> #include <string.h>void setne ...
- hihocoder #1015 : KMP算法
hihocoder.com 上的KMP算法题,搞了半天在VS2012是能通过的,提交上去就是有问题,反复改终于通过了,记录在此,以下是测试通过代码. 输入 第一行一个整数N,表示测试数据组数. 接下来 ...
- LeetCode第28题 实现strStr()之KMP算法(C++)【代码已提交成功】
目录 初步思路 朴素匹配算法 KMP算法 NEXT数组 利用NEXT数组改进朴素匹配算法 初步思路 这是一道难度为简单的题,所以不熟悉的话可能第一反应就是朴素匹配的算法.但因为考研的时候学过数据结构, ...
- 【考研】串的模式匹配算法——KMP算法(含真题)
前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...
- KMP算法真的有这么难吗?(清晰详细版)
KMP算法我一年之前就接触了,但由于实在难以理解next[]求法故放弃,每次做一次字符串匹配的时候,很多情况下都是暴力解决,除了极个别情况把next[]求法背成模板求解AC. 注意:KMP算法已经成为 ...
- Deque(双向队列 c++模版实现 算法导论第三版第十章10.1-5题)
Deque(双向队列 c++模版实现 ) 算法导论第三版第十章10.1-5题 #ifndef C11LEARN_DEQUE_H #define C11LEARN_DEQUE_H template< ...
- 找出第i个小元素(算法导论第三版9.2-4题)
找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度:Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,in ...
- 找出第二小元素(算法导论第三版9.1-1题)
找出第二小元素(算法导论第三版9.1-1题) 时间复杂度Θ(n) 比较次数n+⌈lgn⌉−2次 思路:将元素每次分成2部分,第一部分和第二部分元素成对比较.最终获得最小的元素,记录那些和最小元素比较后 ...
- 经典算法题每日演练——第七题 KMP算法
原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...
最新文章
- Service随系统启动运行
- 《货币是个什么东西》笔记
- Java高级特性——反射
- Sublime Merge Stage时提示系统找不到指定的文件
- 举牌人表情包使用nodejs实现
- CentOS和Ubuntu区别
- Yum介绍与常见用法
- 线性插值和双线性插值
- 互联网大厂薪资最全揭秘:华为
- OSError: cannot open resource
- c语言中感叹号什么意思_感叹号的意思
- Qt获取IE地址栏内容
- atan java_Java Math atan() 使用方法及示例
- win10环境下c语言打开文件失败,cfile fopen fopen_s win10下打开文件失败
- JQuery替换元素
- 金海佳学C++primer 练习9.44
- 走近后厂村程序员的真实生活:拿命换钱
- 再见,VLOOKUP!2021 Excel数据分析已成气候!
- 照片宽高比怎么设置_用好PPT插件,三分钟就能搞定一个心形照片墙
- 菜刀工具连接不上_sdspeed for Mac(SD卡检测工具) v3.0.1
热门文章
- AdminLTE的介绍与使用(详细流程)-----前端框架
- 计算机一直黑屏,电脑开不了机 一直黑屏 电源灯亮着 在线等
- 软件测试报告怎么编写,最新软件测试模板推荐【建议收藏】
- Android Studio Gradle下载慢解决方法
- html5中左浮动怎么写代码,html浮动详解(代码实例)
- 百度前员工因内网发布“女优一览表”被辞退,自诉:想转鉴黄师
- ubuntu18.04 安装绿联usb转网卡驱动
- matlab colorbar 颜色范围,Matlab对数范围colorbar imagesc
- cad画正弦曲线lisp_如何在AutoCAD中画正弦曲线
- cad上样条曲线上的点太多了_CAD如何将样条曲线转换成多段线