首先给一个我能看懂的KMP讲解:

http://blog.csdn.net/v_july_v/article/details/7041827 来自大神july

文章很长,但是慢慢看,会发现讲的很好。

首先有两种KMP的写法:

第一种:

 void getNext()
{
int i=;
int j=-;
nexts[]=-;
while(i<m)
{
if(j==-||num2[i]==num2[j])
{
i++;
j++;
nexts[i]=j;
}
else
j=nexts[j];
}
return;
}
int Kmp()
{
int i=;
int k=;
while(i<n&&k<m)
{
if(k==-||num1[i]==num2[k])
{
i++;
k++;
}
else
k=nexts[k];
if(k==m)
return i-m+;
}
/* if(i<n)
return i-m+1;
else*/
return -;
}

第二种:

 void getNext()
{
int i=;
int j=-;
nexts[]=-;
while(i<m)
{
if(j==-||s2[i]==s2[j])
{
i++;
j++;
nexts[i]=j;
}
else
j=nexts[j];
}
return;
}
int Kmp()
{
int i=;
int k=;
int cnt=;
for(int i=;i<n;i++)
{
while(k&&s1[i]!=s2[k])
k=nexts[k];
if(s1[i]==s2[k])
k++;
if(k==m)
cnt++;
}
return cnt;
}

这两种写法用于不同的地方。

题目总结:

1.求匹配串在文本串出现的次数

直接利用第二种写法即可。

题目:HDU - 1686

2.求匹配串在文本串第一次匹配成功时的起始位置。

套用第一种写法即可。

题目:HDU - 1711

3.给定一个字符串,问我们还需要添加几个字符可以构成一个由n个循环节组成的字符串。

利用Next数组的性质,

  1. 假设字符串的长度为len,那么最小的循环节就是cir = len-next[len] ;
  2. 如果有len%cir == 0,那么这个字符串就是已经是完美的字符串,不用添加任何字符;
  3. 如果不是完美的那么需要添加的字符数就是cir - (len-(len/cir)*cir)),相当与需要在最后一个循环节上面添加几个。

题目:HDU - 3746

4.给你一个字符串 s 求出所有满足s[i] == s[i+p] ( 0 < i+p < len )的 p ;

来自于其他人的做饭:

•知识点:KMP算法、对next数组的理解

•KMP算法中next数组的含义是什么?
•next数组:失配指针
•如果目标串的当前字符i在匹配到模式串的第j个字符时失配,那么我们可以让i试着去匹配next(j)
•对于模式串str,next数组的意义就是:
•如果next(j)=t,那么str[1…t]=str[len-t+1…len]
•我们考虑next(len),令t=next(len);
•next(len)有什么含义?
•str[1…t]=str[len-t+1…len]
•那么,长度为len-next(len)的前缀显然是符合题意的。
•接下来我们应该去考虑谁?
•t=next( next(len) );
•t=next( next (next(len) ) );
• 一直下去直到t=0,每个符合题意的前缀长是len-t
题目:FZU - 1901

最新文章

  1. position: fixed用在iframe里面失效了
  2. Linux screen 命令
  3. Python中判断是否为闰年,求输入日期是该年第几天
  4. linux TCP Wrappers
  5. 大熊君说说JS与设计模式之------策略模式Strategy
  6. Temporary Post Used For Theme Detection (da655c32-bc15-41ad-bf89-e76c1ec1bea7 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
  7. 为什么我们需要性能测试,需要loadrunner
  8. ANT 操控 ORACLE数据库实践
  9. Nginx实现集群的负载均衡配置过程详解
  10. 关于部署php遇到的坑
  11. [原创]Network Emulator for Windows Toolkit使用介绍
  12. Unity反射探针用法教程
  13. GIS案例学习笔记-水文分析河网提取地理建模
  14. 面试真题--------spring源码解析AOP
  15. BZOJ4254 : Aerial Tramway
  16. 转 windows查看端口占用命令
  17. javascript 高度相关
  18. 翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片载入部分进行改动)
  19. POJ1061:青蛙的约会+POJ2115C Looooops+UVA10673Play with Floor and Ceil(扩展欧几里得)
  20. 一个只有十行的精简MVVM框架(下篇)

热门文章

  1. Python——开发一个自动化微信投票器【附代码实例方法】
  2. kubernetes命令详情
  3. NetCore2.0下使用EF CodeFirst创建数据库
  4. 六、latex中的特殊字符
  5. 使用nginx做反向代理和负载均衡效果图
  6. 为什么CentOS7中找不到mysql服务,并且还找不到mysql.sock?
  7. Webpack 学习手记
  8. day2 eclipse+gitee 操作步骤记录留档
  9. Django框架详细介绍---AJAX
  10. 一个handle使用更新线程的实例