要先理解前缀函数的定义,前缀函数 \(\pi(i)\) 表示字符串 \(s[0,i]\) 的同时是其最长真前缀及最长真后缀的长度,简单来说就是这个 \(s[0,i]\) 首尾最长的重叠长度(不能完全重叠)。

注意这里的字符串都是从0开始计数的。

int pi[1005];
void GetPrefixFunction(char *s, int sl) {
pi[0] = 0, pi[1] = 0;
for(int i = 1, k = 0; i < sl; ++i) {
while(k && s[i] != s[k])
k = pi[k];
pi[i + 1] = (s[i] == s[k]) ? ++k : 0;
}
} //返回t在s中所有occurrence的首地址,s和t都是从0开始的
int ans[1005], atop;
void KMP(char *s, int sl, char *t, int tl) {
GetPrefixFunction(t, tl);
atop = 0;
for(int i = 0, k = 0; i < sl; ++i) {
while(k && s[i] != t[k])
k = pi[k];
k += (s[i] == t[k]);
if(k == tl)
ans[++atop] = i - tl + 1;
}
}

最新文章

  1. mysql 批量插入数据存储过程
  2. 使用TypeScript开发
  3. poj 2195 Going Home
  4. [Liferay6.2]Liferay入门级portlet开发示例
  5. angular-input
  6. json-lib 之jsonConfig具体应用
  7. pascal矩阵 分类: 数学 2015-07-31 23:01 3人阅读 评论(0) 收藏
  8. leetcode 109 Convert Sorted List to Binary Search Tree ----- java
  9. spring-boot-quartz, 依赖spring-boot-parent
  10. linux内核函数库文件的寻找
  11. Software Version
  12. hdu 3342 Legal or Not(拓扑排序)
  13. LinkedHashMap 源码详细分析(JDK1.8)
  14. 学好js的步骤
  15. [No0000196]一文读懂Java 11的ZGC为何如此高效
  16. JavaSE 常用类与其方法
  17. .net连接ORACLE数据库
  18. 1. Tensorflow高效流水线Pipeline
  19. logminer实战之生产环境写入数据字典,dg环境查询拷贝日志,测试环境进行挖掘,输出结果
  20. 6 Easy Steps to Learn Naive Bayes Algorithm (with code in Python)

热门文章

  1. python之变量的数据类型(3)dict 及解构简单介绍
  2. 一些SQL保存
  3. trap - 在脚本中处理信号
  4. 机械师实时调度示例(I) - 实时规划
  5. selenium常用的API(一)截屏
  6. 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
  7. 【转】MarkDown添加图片的三种方式
  8. Django之路——1 Django的简介
  9. 「NOI2012」迷失游乐园
  10. 国产MM才叫漂亮[景甜]