KMP算法中也涉及到子串与前缀的重复,而扩展KMP算法求得就是字符串S的所有后缀与字符串T的最长公共前缀
可以知道,一个字符串所有的子串便是这个字符串所有后缀的所有前缀(或前缀的后缀 ),那么求的信息其实也是字符串S的所有子串与字符串T前缀的重复
每个后缀的最长公共前缀长度存在一个extend数组中,具体代码没有研究,给当模板用了。。
void getextend() { int p = 0; while (p < m && p < n && s[p + 1] == t[p + 1]) { //计算第一个后缀 p++; } extend[1] = p; int k = 1, l; for (int i = 2; i <= m; i++) { p = k + extend[k] - 1; l = next[i - k + 1]; if (i + l <= p) { extend[i] = l; } else { int j = p - i + 1; if(j < 0) j = 0; while(i + j <= m && j + 1 <=n && s[i + j] == t[j + 1]) j ++; extend[i] = j; k = i; } } }
推荐个题目,旋转数字 : http://acm.hdu.edu.cn/showproblem.php?pid=4333