KMP算法题型大致有两类,一类是next数组的应用,一类是匹配问题。

next数组大多数是求字符串周期,或者是与前缀后缀有关,也可以应用在DP中。需要对next数组有一定理解才能做得出。

next数组有一些性质。L为字符串长度。

如,L%(L-next[L])==0,说明字符串S[0,L-next[L]]是重复子串。

周期串/求循环节:

HDU 1358  Period

http://acm.hdu.edu.cn/showproblem.php?pid=1358

 #include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #include<algorithm>
 #define MAXN 1000005
 using namespace std;
 int next[MAXN];
 char str[MAXN];
 void getFail()
 {
     ; str[i]; ++i)
     {
         int j=next[i];
         while(j&&str[i]!=str[j]) j=next[j];
         next[i+]=(str[i]==str[j])?j+:;
     }
 }
 int main()
 {
     ;
     while(scanf("%d",&n)&&n)
     {
         scanf("%s",str);
         getFail();
         printf("Test case #%d\n",++kase);
         ; i<=n; ++i)
         {
             int k=i-next[i];
             &&i/k!=) printf("%d %d\n",i,i/k);
         }
         printf("\n");
     }
     ;
 }

HDU 3746  Cyclic Nacklace

http://acm.hdu.edu.cn/showproblem.php?pid=3746

POJ 2406  Power Strings

http://poj.org/problem?id=2406

 #include<iostream>
 #include<cstring>
 #include<cstdio>
 using namespace std;
 ];
 ];
 void getFail()
 {
     ; str[i]; ++i)
     {
         int j=next[i];
         while(j&&str[i]!=str[j]) j=next[j];
         next[i+]=(str[i]==str[j])?j+:;
     }
 }
 int main()
 {
     ]!='.')
     {
         getFail();
         int L=strlen(str);
         int p=L-next[L];
         ) printf("%d\n",L/p);
         );
     }
     ;
 }

前缀/后缀:

POJ 2752  Seek the Name, Seek the Fame

http://poj.org/problem?id=2752

HDU 2594  Simpsons’ Hidden Talents

http://acm.hdu.edu.cn/showproblem.php?pid=2594

HDU 4300 Clairewd’s message

http://acm.hdu.edu.cn/showproblem.php?pid=4300

 #include<iostream>
 #include<vector>
 #include<cmath>
 #include<map>
 #include<string>
 #include<cstring>
 using namespace std;
 ],lenb;
 map<char,char> has;
 string str,a,b,s;
 //char has[30];
 void getFail()
 {
     ; i<str.size(); ++i)
     {
         int j=next[i];
         while(j&&str[i]!=str[j]) j=next[j];
         next[i+]=(str[i]==str[j])?j+:;
     }
 }
 string ans;
 void Find(int p)
 {

     while(!(next[p]<=(lenb-next[p]))) p=next[p];
     ans.clear();
     ;  i<a.size(); ++i) ans+=a[i];
     for(int i=next[p];  i<lenb-next[p];  ++i) ans+=b[i];

 }
 int main()
 {
     int T;
     cin>>T;
     while(T--)
     {
         cin>>s>>a;
         b.clear();
         has.clear();
         ; i<s.size(); ++i)
             has[s[i]]=i+'a';
         ; i<a.size(); ++i)
             b+=has[a[i]];
         str=b+a;
         lenb=b.size();
         getFail();
         Find(str.size());
         cout<<ans<<endl;
     }
     ;
 }

其他:

HDU 3336  Count the string

http://acm.hdu.edu.cn/showproblem.php?pid=3336

字符串匹配问题主要有匹配单个模版串,寻找公共子串。难的是它的应用。

单串匹配:问一个字符串在另一个字符串里出现了多少次。

HDU 2087  剪花布条  (不能重叠)

http://acm.hdu.edu.cn/showproblem.php?pid=2087

POJ 3461  Oulipo (可以重叠)

http://poj.org/problem?id=3461

二维匹配:

POJ 2185  Milking Grid

http://poj.org/problem?id=2185

需要降维后再使用KMP。

公共子串:此类问题大多数是KMP+暴力枚举

POJ 3080  Blue Jeans

http://poj.org/problem?id=3080

POJ 3450  Corporate Identity

http://poj.org/problem?id=3450

其它:

待补充。。。

ACM - KMP题目小结 (更新中)的更多相关文章

  1. ACM -二分图题目小结

    暂时只包括与最大匹配相关的问题. 求最大独立集,最小路径覆盖等等大多数题目都可以转化为求最大匹配用匈牙利算法解决. 1.最大匹配(边集) 此类问题最直接,直接用匈牙利算法即可. HDU 2063  过 ...

  2. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  3. js坑爹笔试题目汇总(持续更新中)

    把你的面试官问倒,你就是一个合格的面试者了,以下总结一些易错的js笔试题目,会持续更新中.欢迎关注 1,考察this var length = 10 function fn(){ alert(this ...

  4. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  5. 【小TIP】记录各种错误【更新中】

    最好程序一遍通过,为了提高代码能力,这里将用TIP的形式记录来犯过的错误.不断更新中. *已经转移到闪存.. [150214]WA:检查是否数组开小了. [150212]WA:如果程序中有乘号,需要留 ...

  6. 404boom 博客闪现【不断的优化更新中。。。】

    404boom 博客闪现[不断的优化更新中...] 停止本篇博文EQ继续优化,所有博文将会在标签[cnblogs_v2 ]中重新整理,待完成统一放上链接 一:Java SE相关1.Java的概述2.J ...

  7. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  8. 2020年腾讯实习生C++面试题&持续更新中(2)

    2020年腾讯实习生C++面试题&持续更新中(2) hello,大家好~ 我是好好学习天天,天天编程的天天,一个每天都死磕技术,及时分享的技术宅~ 昨天分享的题目不知道大家是否看过了,以后我计 ...

  9. 2020年腾讯实习生C++面试题&持续更新中(1)

    2020年腾讯实习生C++面试题&持续更新中(1) 腾讯面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的 ...

随机推荐

  1. Windows7睡眠后自动唤醒

    笔者的电脑(Windows7 64位旗舰版)睡眠后,隔段时间后会自动唤醒.经两项配置后,解决了该问题. 1 禁用唤醒定时器 控制面板里进入"电源选项""更改计划设置&qu ...

  2. eclipse 新建 maven 项目 步骤(初级入门新手)

    安装 maven(百度) 和在eclipse 中svn(上一篇) 修改 maven 本地仓库 eclipse 属性 maven--> installations-->添加新的 自定义安装的 ...

  3. worker中加载本地文件报错的解决方案

    如果在一个swf的主线程中加载文件时,报安全沙箱的错误, 网上有诸多的解决方案.但是如果在一个worker中加载本地文件报类似如下的错误: *** 安全沙箱冲突 *** SecurityError: ...

  4. ios使用webview浏览指定网页

    #import "EDRViewController.h" @interface EDRViewController () @property(nonatomic,weak) UI ...

  5. .ecp认证文件(10.3版本)

    arcgisserver,103,ecp.arcgis.engine,01-jan-2030,E9PJJE2G05FB8RZDF121 3dengine,103,ecp.arcgis.engine,0 ...

  6. ZOJ 3822(求期望)

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  7. linux 系统安装 mysql

    安装mysql所需要的依赖环境 yum -y install gcc gcc-c++ gcc-g77 autoconf automake zlib*  libxml* ncurses-devel li ...

  8. idea tomcat +eclipse式的部署

    使用习惯了eclipse, 还没开始使用maven, 使用idea 有些不太习惯,现在记录下来,以备忘. /*这一步在tomcat使用external source时,其实是不起作用的**/   a. ...

  9. Linux创建LVM

    ###########format disk############ 格式化磁盘,将其SystemId修改为8e fdisk /dev/sdb n p 1 [enter] [enter] t 8e w ...

  10. spring中配置jdbc数据源

    1.加入jdbc驱动器包,mysql-connector-java.jar 2.加入commons-dbcp.jar配置数据源 3.在classpath下新建文件jdbc.properties,配置j ...