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. UVA 1616 Caravan Robbers 商队抢劫者(二分)

    x越大越难满足条件,二分,每次贪心的选区间判断是否合法.此题精度要求很高需要用long double,结果要输出分数,那么就枚举一下分母,然后求出分子,在判断一下和原来的数的误差. #include& ...

  2. iBatis for net 框架使用

    简介:ibatis 一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,到后面发展的版本叫MyBatis但都是指的同一个东西.最 ...

  3. python基础一 day15 面试题

    # def demo():# for i in range(4):# yield i## g=demo()## g1=(i for i in g)# g2=(i for i in g1)## prin ...

  4. 《剑指offer》56 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   在线练习:https://www.nowcoder.com/practice/e02fdb5 ...

  5. Java基础 匿名内部类 异常 多线程 集合面试题

    匿名内部类:没有名字的内部类.就是内部类的简化形式.一般只用一次就可以用这种形式.匿名内部类其实就是一个匿名子类对象.想要定义匿名内部类:需要前提,内部类必须继承一个类或者实现接口. 匿名内部类的格式 ...

  6. Linux下如何通过命令检查网卡是否插上网线

    How To:Linux下如何通过命令检查网卡是否插上网线   主要工具为ethtool来检查,主要关注的字段为"Link detected",注意如下的输出,其中em4实际物理上 ...

  7. NOIP模拟赛 路面修整

    [题目描述] FJ打算好好修一下农场中某条凹凸不平的土路.按奶牛们的要求,修好后的路面高度应当单调上升或单调下降,也就是说,高度上升与高度下降的路段不能同时出现在修好的路中. 整条路被分成了N段,N个 ...

  8. Java语言中的异常处理

    Java语言中的异常处理包括声明异常.抛出异常.捕获异常和处理异常四个环节.   throw用于抛出异常.   throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异 ...

  9. 【数位dp】bzoj3131: [Sdoi2013]淘金

    思路比较自然,但我要是考场上写估计会写挂:好像被什么不得了的细节苟住了?…… Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1. ...

  10. 【dp】P1982 小朋友的数字

    有趣的细节题目 题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之 ...