hdu 1711 KMP算法模板题
2015-07-22 23:00
225 查看
题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。
当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。
当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。
防止超时,注意一些细节。。
另外:尽量少用strlen,变量记录下来使用比较好,用字符数组而不用string
当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。
当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。
防止超时,注意一些细节。。
另外:尽量少用strlen,变量记录下来使用比较好,用字符数组而不用string
//KMP算法模板题 //hdu 1711 #include<iostream> #include<string.h> using namespace std; int a[1000010]; int b[10010]; int next1[10010]; void getnext(int len)//参数是子串的长度 { int i=0,j=-1; next1[0]=-1; while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next1[i]=j; } else j=next1[j]; } } int KMP(int n,int m)//参数是原始串和子串的长度 { int i=0,j=0;//注意是0 while(i<n&&j<m) { if(j==-1||a[i]==b[j]) { i++; j++; } else j=next1[j]; } if(j==m)//已经找到,注意如果下表为1,改为i-j+1; return i-j; else return -1; } int main() { int T; int n,m; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; getnext(m); int ans=KMP(n,m); cout<<ans<<endl; } return 0; }
相关文章推荐
- bzoj1264
- (int)a和(int&)a的区别
- java动态代理
- Mysql数据库中不能插入中文
- C++sort函数的用法
- S3C2440A时钟控制逻辑
- hibernate4.x(一)——hibernate入门之helloworld
- 指向结构体的指针
- 股票学习(k线分析)
- Numb
- for循环的嵌套
- Android布局(二)RelativeLayout
- 手机移动端js插件手指缩放图片
- 对android rotation的添加与定制
- 2015第30周三Spring常用工具类
- oc009---内存管理原则
- 生成子类对象时会不会也生成父类对象
- Linux kernel 分析之十六:文件系统-用C来实现面向对象
- ssh登录拦截器配置
- C#高级编程四十八天----列表