kmp-模板-hd-1711
/*
题意:给两个数串,求模板串第一此出现在源串中的位置,开头的位置;没有输出-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的更多相关文章
- HDU 1711 - Number Sequence - [KMP模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- HDU 1711 Number Sequence(KMP模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1711 这道题就是一个KMP模板. #include<iostream> #include<cs ...
- hdu 1686 KMP模板
// hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...
- Oulipo HDU 1686 KMP模板
题目大意:求模式串在主串中的出现次数. 题目思路:KMP模板题 #include<iostream> #include<algorithm> #include<cstri ...
- KMP模板(bin)
KMP模板 主要是kuangbin的模板,之后加了一点我的习惯和理解. kmpN() 作用:构造next数组 参数:模式串,模式串长度 kmpC() 作用:返回模式串在主串中出现的次数(可重复) 参数 ...
- 剪花布条---hdu2087(kmp模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 kmp模板题: #include <cstdio> #include <cst ...
- Oulipo----poj3461(kmp模板)
题目链接:http://poj.org/problem?id=3461 和 减花布条 的题对比一下: 求s2中s1的个数kmp模板: #include<stdio.h> #include& ...
- kmp模板 && 扩展kmp模板
kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- [HDU1711]KMP模板
解题关键:1.直接套kmp模板即可,注意最后输出的位置,需要在索引的位置+1. 2.next用作数组名在oj中会编译错误, 3.选用g++,只有g++才会接受bits/stdc++.h OJ中g++和 ...
随机推荐
- PHP的优良习惯(转)
1.多阅读手册和源代码 没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西,特别是很多有关于字符串和数组的函数.就在这些函数里面包括许多有用的功能,如果你仔细阅读手册,你会经常发 ...
- codeforce Gym 100500I Hall of Fame (水)
题意:统计一些串中,字母的出现频率,不分大小写,找出现频率最高5个字符(相同频率优先取字典序大的),把他们的对应的值加起来判断以下是否大于62. 没出现的不算. #include<cstdio& ...
- Python——序列封包与序列解包
一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...
- JAVA - Annotation 注解 入门
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- 03_4_this关键字
03_4_this关键字 1. this关键字 在类的方法定义中使用的this关键字代表使用该方法的对象的引用. 当必须指出当前使用方法的对象是谁时要使用this. 有时使用this可以处理方法中成员 ...
- APP上线碰到的问题:Non-public API usage
①.Non-public API usage:The app references non-public symbols in XXXX: _UICreateCGImageFromIOSurface ...
- MySQL左右连接查询中的NULL的数据筛选问题
这里使用左连接为例子,对于左连接是将左边表的数据显示,右边表中如果没有对应的数据则使用null填充. game表: game_type表: SELECT g.name,g.type_id,t.type ...
- 02Vs2013常用路径配置
1.设置头文件路径 项目 -> xxx属性页 -> 配置属性 -> C/C++ -> 常规 -> 附加包含目录. 2.包含 x.lib 库路径 项目 -> xxx属 ...
- Hessian知识学习总结(二)——Hessian的helloworld
一.下载Hessian 可在hessian官网http://hessian.caucho.com/ 或者http://download.csdn.net/detail/wodediqizhang/95 ...
- 设置vim 永久显示行号
永久显示行号:如果想让vim永久显示行号,则需要修改vim配置文件vimrc.如果没有此文件可以创建一个.在启动vim时,当前用户根目录下的vimrc文件会被自动读取,因此一般在当前用户的根目录下创建 ...