扩展KMP模板
来源:互联网 发布:python数据分析入门 编辑:程序博客网 时间:2024/06/06 05:47
扩展kmp
学习资料:
扩展kmp学习资料
关于扩展kmp:
定义母串S,和子串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前缀,也就是说,设extend数组,extend[i]表示T与S[i,n-1]的最长公共前缀,要求出所有extend[i](0<=i<n)。
时间复杂度分析:
下面来分析一下算法的时间复杂度,通过上面的算法介绍可以知道,对于第一种情况,无需做任何匹配即可计算出extend[i],对于第二种情况,都是从未被匹配的位置开始匹配,匹配过的位置不再匹配,也就是说对于母串的每一个位置,都只匹配了一次,所以算法总体时间复杂度是O(n)的,同时为了计算辅助数组next[i]需要先对字串T进行一次拓展kmp算法处理,所以拓展kmp算法的总体复杂度为O(n+m)的。其中n为母串的长度,m为子串的长度。
题型分析:
模板:
#include <bits/stdc++.h> using namespace std; const int maxn=100010; int next[maxn],ex[maxn]; //ex数组即为extend数组 //预处理计算next数组 void getnext(string str) { int i=0,j,po,len=str.size(); next[0]=len;//初始化next[0] while(str[i]==str[i+1]&&i+1<len)//计算next[1] i++; next[1]=i; po=1;//初始化po的位置 for(i=2;i<len;i++) { if(next[i-po]+i<next[po]+po)//第一种情况,可以直接得到next[i]的值 next[i]=next[i-po]; else//第二种情况,要继续匹配才能得到next[i]的值 { j=next[po]+po-i; if(j<0)j=0;//如果i>po+next[po],则要从头开始匹配 while(i+j<len&&str[j]==str[j+i])//计算next[i] j++; next[i]=j; po=i;//更新po的位置 } } } //计算extend数组 void exkmp(string s1,string s2) { int i=0,j,po,len=s1.size(),l2=s2.size(); getnext(s2);//计算子串的next数组 while(s1[i]==s2[i]&&i<l2&&i<len)//计算ex[0] i++; ex[0]=i; po=0;//初始化po的位置 for(i=1;i<len;i++) { if(next[i-po]+i<ex[po]+po)//第一种情况,直接可以得到ex[i]的值 ex[i]=next[i-po]; else//第二种情况,要继续匹配才能得到ex[i]的值 { j=ex[po]+po-i; if(j<0)j=0;//如果i>ex[po]+po则要从头开始匹配 while(i+j<len&&j<l2&&s1[j+i]==s2[j])//计算ex[i] j++; ex[i]=j; po=i;//更新po的位置 } } } int main() { string s1,s2;//s1为母串 s2为子串 cin>>s1>>s2; exkmp(s1,s2); for(int i=0;i<s1.size();i++) cout<<ex[i]; return 0; }
阅读全文
1 0
- KMP,扩展KMP模板
- [模板]扩展KMP模板
- 【模板】kmp以及扩展kmp
- 扩展kmp模板
- 扩展KMP模板
- 扩展KMP模板
- 扩展kmp 模板
- 扩展KMP模板
- 扩展KMP模板
- 扩展KMP模板
- 【模板】扩展kmp
- 【字符串】【扩展kmp模板】
- 扩展kmp模板
- 模板_扩展kmp
- (扩展KMP)模板
- 扩展KMP模板
- hdu 2594 扩展KMP模板题
- ACM常用模板——扩展KMP
- elasticsearch+logstash+kibana5.5.2集成searchguard实现用户权限管理(二)
- spring + quartz定时器
- 用户消费行为分析
- 运用dubbo框架之后logback.xml在Linux不起作用
- MATLAB中改变默认工作路径(Current Folder)的2种方法 软件版本:MATLAB2012b 电脑系统:win8.1 方法一: 1. 桌面快捷方式——右键“属性”——在选项卡里选“快
- 扩展KMP模板
- 根据身份证号获取性别
- 1022. Digital Library (30)
- poj 3299
- Caused by: rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value
- [Java并发]使用CountDownLatch和CyclicBarrier等待多线程完成
- 圆桌游戏
- 第二周项目三 体验复杂度
- 机器学习的框架、平台、系统、库和工具包的列表