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. 关于智能指针boost::shared_ptr

    boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎. 但在实际的使用过程中,笔者也发现了一些不足. 1.定制的删除器 shared_ptr除了可以使用默认 ...

  2. linux笔记:关机重启命令shutdown,系统运行级别init,退出登录logout

    命令名称:shutdown功能:关机或重启用法:shutdown [选项] [时间]选项参数:-c 取消前一个关机命令-h 关机-r 重启时间格式:now 现在时:分 20:30其他:会正常关闭正在启 ...

  3. 委托(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/ms173171.aspx delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型. 在实例 ...

  4. robotframework笔记27

    文档格式 可以使用简单的HTML格式 测试套件 , 测试用例 和 用户关键字 文档和 免费测试套件 元数据 在测试数据,以及当 记录测试 库 . 格式类似于大多数使用的风格 维基百科,它被设计成可以理 ...

  5. 《Java程序设计》实验二 实验报告

    实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Lin ...

  6. js 继承inheritance/extends

    主要就是<javascript语言精粹>语言精粹中的内容 5.1伪类 Function.prototype.method = function(name,func){ this.proto ...

  7. js打印图形

    1. js绘画金字塔 思想:先画n-i个空格,再画2*i-1个*号,再画n-i个空格(此处可以省略),一行画完之后换行:循环下一行(先判断每行的空格数和*号与行数间的关系) var  n=window ...

  8. java之多线程(Thread)

    package DEMO; //主线程 public class Example12_2 { public static void main(String [] args ) { Thread myd ...

  9. case when 对某个字段值分类讨论

    SELECT SM_ID,SM_CID,SM_STATION,SM_TIME,PS_CODE,PS_NUMBER,SS_NAME,SS_CODE, ( THEN '中转站' END) FROM dbo ...

  10. Windows上模拟Linux环境

    有两种方法,一直是 MinGW http://jingyan.baidu.com/article/8cdccae985cf7c315413cd35.html 另外可以用 cygwin http://j ...