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++和 ...
随机推荐
- Python XML 解析
什么是 XML? XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并 ...
- 在DataGridView控件中启用换行
实现效果: 知识运用: DataGridView控件公共属性DefaultCellStyle的WrapMode属性 public DataGridViewTriState WrapMode { ge ...
- Python-DDT实现接口自动化
Get请求参数化例子 import unittest import requests import ddt @ddt.ddt class MyTestCase(unittest.TestCase): ...
- sessionStorage对象
sessStorage对象是一个会话形式的数据存储,当用户关闭浏览器的窗口后,数据就会被删除. 实例: <!DOCTYPE html><html><head> &l ...
- MySQL 数据备份与还原的示例代码
MySQL 数据备份与还原的示例代码 这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.数据备份 1.使用 ...
- Java基础操作面试题:Map集合排序 需要TreeMap 构造方法参数有比较器 输入字符串,统计A、B、C、D、出现次数,由高到低输出字母和出现次数,使用Map集合完成此题
Map和Collections是同级别的,不能像List排序那样直接用Collections.sort(new Comparator<?>(){ 复写compara方法}); HashMa ...
- NOIP模拟赛 czy的后宫4
czy的后宫4 [问题描述] czy有很多妹子,妹子虽然数量很多,但是质量不容乐观,她们的美丽值全部为负数(喜闻乐见). czy每天都要带N个妹子到机房,她们都有一个独一无二的美丽值,美丽值为-1到- ...
- node 文件下载到本地 (支持中文文件名)
downloadfile:function(req,res,next){ var name= encodeURI(req.query.name); var path= req.query.url; v ...
- paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之onehot coding styles(index-parameter style with registered outputs)
case语句中,对于state/next 矢量仅仅做了1-bit比较. parameter 值不是表示FSM的状态编码,而是表示state/next变量的索引.
- Python基础——赋值机制
使用id()函数用于获取对象的内存地址. 使用is来判断是不是指向同一个内存. 把一个对象赋值给另一个对象,两个对象都指向同一个内存地址. test=1000 test1=test id(test) ...