题目链接
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版相关推荐

  1. UVA475 KMP算法题

    分析:题意个人感觉比较难懂..英语太弱.. 大意是给定一个带有通配符的字符串,后面紧跟着列出一大堆字符串,需要你查找其中符和格式的字符串.. 根据星号所在位置对原字符串进行分割.然后通过KMP算法进行 ...

  2. KMP算法(C语言版)

    有关字符串匹配的最有效的算法. 其算法复杂度为两个字符串的长度之和(m+n). #include <stdio.h> #include <string.h>void setne ...

  3. hihocoder #1015 : KMP算法

    hihocoder.com 上的KMP算法题,搞了半天在VS2012是能通过的,提交上去就是有问题,反复改终于通过了,记录在此,以下是测试通过代码. 输入 第一行一个整数N,表示测试数据组数. 接下来 ...

  4. LeetCode第28题 实现strStr()之KMP算法(C++)【代码已提交成功】

    目录 初步思路 朴素匹配算法 KMP算法 NEXT数组 利用NEXT数组改进朴素匹配算法 初步思路 这是一道难度为简单的题,所以不熟悉的话可能第一反应就是朴素匹配的算法.但因为考研的时候学过数据结构, ...

  5. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

  6. KMP算法真的有这么难吗?(清晰详细版)

    KMP算法我一年之前就接触了,但由于实在难以理解next[]求法故放弃,每次做一次字符串匹配的时候,很多情况下都是暴力解决,除了极个别情况把next[]求法背成模板求解AC. 注意:KMP算法已经成为 ...

  7. Deque(双向队列 c++模版实现 算法导论第三版第十章10.1-5题)

    Deque(双向队列 c++模版实现 ) 算法导论第三版第十章10.1-5题 #ifndef C11LEARN_DEQUE_H #define C11LEARN_DEQUE_H template< ...

  8. 找出第i个小元素(算法导论第三版9.2-4题)

    找出第i个小元素(算法导论第三版9.2-4题) 期望时间复杂度:Θ(n) 最坏情况的时间复杂度Θ(n^2) int randomized_select_based_loop(int *array,in ...

  9. 找出第二小元素(算法导论第三版9.1-1题)

    找出第二小元素(算法导论第三版9.1-1题) 时间复杂度Θ(n) 比较次数n+⌈lgn⌉−2次 思路:将元素每次分成2部分,第一部分和第二部分元素成对比较.最终获得最小的元素,记录那些和最小元素比较后 ...

  10. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

最新文章

  1. Service随系统启动运行
  2. 《货币是个什么东西》笔记
  3. Java高级特性——反射
  4. Sublime Merge Stage时提示系统找不到指定的文件
  5. 举牌人表情包使用nodejs实现
  6. CentOS和Ubuntu区别
  7. Yum介绍与常见用法
  8. 线性插值和双线性插值
  9. 互联网大厂薪资最全揭秘:华为
  10. OSError: cannot open resource
  11. c语言中感叹号什么意思_感叹号的意思
  12. Qt获取IE地址栏内容
  13. atan java_Java Math atan() 使用方法及示例
  14. win10环境下c语言打开文件失败,cfile fopen fopen_s win10下打开文件失败
  15. JQuery替换元素
  16. 金海佳学C++primer 练习9.44
  17. 走近后厂村程序员的真实生活:拿命换钱
  18. 再见,VLOOKUP!2021 Excel数据分析已成气候!
  19. 照片宽高比怎么设置_用好PPT插件,三分钟就能搞定一个心形照片墙
  20. 菜刀工具连接不上_sdspeed for Mac(SD卡检测工具) v3.0.1

热门文章

  1. AdminLTE的介绍与使用(详细流程)-----前端框架
  2. 计算机一直黑屏,电脑开不了机 一直黑屏 电源灯亮着 在线等
  3. 软件测试报告怎么编写,最新软件测试模板推荐【建议收藏】
  4. Android Studio Gradle下载慢解决方法
  5. html5中左浮动怎么写代码,html浮动详解(代码实例)
  6. 百度前员工因内网发布“女优一览表”被辞退,自诉:想转鉴黄师
  7. ubuntu18.04 安装绿联usb转网卡驱动
  8. matlab colorbar 颜色范围,Matlab对数范围colorbar imagesc
  9. cad画正弦曲线lisp_如何在AutoCAD中画正弦曲线
  10. cad上样条曲线上的点太多了_CAD如何将样条曲线转换成多段线