p数组记录的是当该位置上失配的时候,跳到第几个进行继续匹配;
 /*
题意:给两个数串,求模板串第一此出现在源串中的位置,开头的位置;没有输出-1;
算法:kmp
先对字符串进行自匹配;
然后串间匹配;
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int s[],t[],p[];//s是源串,t是模板串,p是自匹配数组(next);
int n,m;
int kmp()//模板;
{
int ans=;
p[]=p[]=;
//p数组是错位排列的,p[i]表示的是p[i-1]的信息;即到目前为止的最长前缀;
for(int i=;i<m;i++)
{
int j=p[i];
while(j&&t[i]!=t[j])
{
j=p[j];//定位j的位置;
}
p[i+]=t[i]==t[j]?j+:;
}
int j=,temp=;
for(int i=;i<n;i++)
{
while(j&&s[i]!=t[j])
{
j=p[j];
}
if(s[i]==t[j])
j++;
if(j==m)
return i+-m+;
}
return ;
//可以判断是否有子串,也可以计算有多少子串;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(s,,sizeof(s));
memset(t,,sizeof(t));
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d",&s[i]);
for(int i=;i<m;i++)
{
scanf("%d",&t[i]);
}
int ans=kmp();
if(ans==)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}

下面是自己按照俞勇的书敲的模板;比较详细一点,理解更深了一点;

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
string s,pattern;
int next[]={};
int n,m;
int position[]={};//标记每一个字串的起始位置;
void kmp()
{
for(int i=;i<n;i++)
{
int j=i;
while(j>)
{
j=next[j];
if(pattern[j]==pattern[i])
{
next[i+]=j+;
break;
}
}
}
for(int i=,j=;i<m;i++)
{
//i标记的是大串上的位置,j标记的是小串上的位置;
if(j<n&&s[i]==pattern[j])
j++;
else
{
// 如果失配j就跳到小串的下一个位置继续匹配;
while(j>)//j等于0就是没有继续可跳的位置;
{
j=next[j];
if(s[i]==pattern[j])
{
j++;
break;
}
}
}
if(j==n)
cout<<i-n++<<endl;//返回起始位置(i-n+1)是数组中的位置,再加1是从一开始的位置定位;
}
//没有子串,在这里可以返回-1;
}
int main()
{
cin>>s>>pattern;
n=pattern.size();
m=s.size();
kmp();
return ;
}

kmp-模板-hd-1711的更多相关文章

  1. HDU 1711 - Number Sequence - [KMP模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  2. HDU 1711 Number Sequence(KMP模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...

  3. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  4. Oulipo HDU 1686 KMP模板

    题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...

  5. KMP模板(bin)

    KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...

  6. 剪花布条---hdu2087(kmp模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...

  7. Oulipo----poj3461(kmp模板)

    题目链接:http://poj.org/problem?id=3461 和 减花布条 的题对比一下: 求s2中s1的个数kmp模板: #include<stdio.h> #include& ...

  8. kmp模板 && 扩展kmp模板

    kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...

  9. kuangbin专题16B(kmp模板)

    题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...

  10. [HDU1711]KMP模板

    解题关键:1.直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1. 2.next用作数组名在oj中会编译错误, 3.选用g++,只有g++才会接受bits/stdc++.h OJ中g++和 ...

随机推荐

  1. jquery的uploadify插件实现的批量上传V3.2.1版

    你需要如下配置(包括引入文件)HTML: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&quo ...

  2. PHP程序Laravel框架的优化技巧

    Laravel是一套简洁.优雅的php Web开发框架(PHP Web Framework).它可以让你从杂乱的代码中解脱出来,可以帮你构建一个完美的网络app,而且每行代码都简洁.富于表达力.而性能 ...

  3. C++ 值传递&引用&地址

  4. cityspace

    类别的网址:https://blog.csdn.net/u010069760/article/details/77847595 r,g,b:  250 170 160 parking   244 35 ...

  5. javaweb基础(17)_jsp九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  6. Bootstrap历练实例:带列表组的面板

    带列表组的面板 我们可以在任何面板中包含列表组,通过在 <div> 元素中添加 .panel 和 .panel-default 类来创建面板,并在面板中添加列表组.您可以从 列表组 一章中 ...

  7. git 指令记录

    由于之前一直用svn 用git也是用图形化的工具 还是要了解一下git指令 因为都是版本控制工具 有很多相似之处 所以理解起来也比较轻松 仓库: github上面的项目 工作目录下面的所有文件都不外乎 ...

  8. JDBC操作数据库的详细步骤

    1.注册驱动 告知JVM使用的是哪一个数据库的驱动 2.创建连接 使用JDBC中的类,完成对MySQL数据库的连接 3. 得到执行sql语句的Statement对象 通过连接对象获取对SQL语句的执行 ...

  9. 【Git版本控制】GitHub上fork项目和clone项目的区别

    fork:在github页面,点击fork按钮,将别人的仓库复制一份到自己的仓库. clone:直接将github中的仓库克隆到自己本地电脑中 问题1:pull request的作用 比如在仓库的主人 ...

  10. input类型

    由于我们学习一个新的知识,而以前的都差不多忘完了,下面来复习我们以前学习的input的类型: button     点击的按钮                date    年/月/日 CheckBo ...