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++和 ...
随机推荐
- (外挂破解)Cheat Engine(内存修改工具)V6.2中文版软件介绍
Heat Engine是一款内存修改编辑工具,Cheat Engine允许你修改你的游戏,所以你将总是赢.它包括16进制编辑,反汇编程序,内存查找工具.与同类修改工具相比,它具有强大的反汇编功能,且自 ...
- springboot 测试
本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...
- Dojo的define接口
http://blog.csdn.net/lovecarpenter/article/details/53979717 第三种用法用的最多. 此接口用于定义模块: define([],function ...
- 01_1_Socket实现
01_1_Socket实现 1.什么是MIME Multipurpos Internet Mail Extension 指明白传送内容的格式 最早用于邮件附件 2.HTTP协议基础 HTTP(Hype ...
- Maven配置项目依赖使用本地仓库的方法汇总
Maven配置项目使用本地仓库有以下方式实现: 1.类似本地仓库,但是属于本地依赖,比如某个JAR包是引用第三方的,直接放在了项目的lib文件夹,那么此时可以如下配置项目的POM: <depen ...
- 收集的有关mdk 3的使用方法
收集来自网络上的有关mdk3的一些使用方法以及技巧(持续更新) b beacon泛洪攻击 -f 指定wifi名称的文件夹 -n 加上wifi名称 -w Fake WEP encrypted sta ...
- GoF23种设计模式之结构型模式之外观模式
一.概述 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.适用性 1.当你要为一个复杂子系统提供一个简单接口的时候.子系统 ...
- w3resource_MySQL练习:Basic_select_statement
w3resource_MySQL练习题:Basic_select_statement 1. Write a query to display the names (first_name, last_n ...
- Anaconda的安装、使用以及与PyCharm的链接
初学Python的盆友们是否有这样的疑惑: 选择Python2还是Python3呢?(后者并不完全兼容前者) 听说两者可以同时安装,那怎么管理呢? Python那么丰富的第三方库,一个一个装太麻烦啦 ...
- Python9-loggin模块-day29
什么叫日志日志 是用来记录用户行为或者代码的执行过程 # import logging # logging.debug('debug message') #低级别的 排除信息 # logging.in ...