[poj3461]Oulipo_KMP
Oulipo poj-3461
题目大意:给你两个字符串s和p,问s中有多少个等于p的子串。
注释:$1\le strlen(p)\le 10^4\qquad1\le strlen(s)\le 10^6$
想法:刚刚学习KMP,先来一道裸题。什么是KMP?
KMP是一种字符串匹配算法。如果求出在一个母串中子串出现的位置,我们用一种办法就是枚举母串中任意一个位置pos[i]作为子串开始节点,然后向后匹配,如果匹配成功或者失配,我们都必须重新从pos[i]+1开始重新枚举。我们假设已经匹配到了p串的j号字符,但是我们发现p串中的一些字符是不需要进行重新匹配的,我们就可以通过next数组来使得当前的j跳到next[j]来重新进行匹配,这样的算法,就是KMP(3个人名)。
附上版子
这是求next数组的版子
void GetNext()
{
int pLen=strlen(p);
int k=-1;
int j=0;
next[0]=-1;
while(j<pLen)
{
if(k==-1||p[j]==p[k])
{
++k;
++j;
next[j]=k;
}
else k=next[k];
}
}
然后我们一起看一下实现KMP的版子。
void KmpSearch()
{
int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
while(i<sLen)
{
if(j==-1 || s[i] == p[j] ) i++ , j++;
else j=next[j];
if(j==pLen)
{
ans++,j=next[j];
}
}
}
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char p[10010];
char s[1001000];
int next[10010];
void GetNext()
{
int pLen=strlen(p);
int k=-1;
int j=0;
next[0]=-1;
while(j<pLen)
{
if(k==-1||p[j]==p[k])
{
++k;
++j;
next[j]=k;
}
else k=next[k];
}
}
int ans=0;
void KmpSearch()
{
int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
while(i<sLen)
{
if(j==-1 || s[i] == p[j] ) i++ , j++;
else j=next[j];
if(j==pLen)
{
ans++,j=next[j];
}
}
}
void original()
{
memset(next,0,sizeof next);
ans=0;
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
original();
scanf("%s%s",p,s);
GetNext();
KmpSearch();
printf("%d\n",ans);
}
return 0;
}
小结:第一道KMP(好像大部分KMP的题都被我用hashShi过了)
[poj3461]Oulipo_KMP的更多相关文章
- 【poj3461】 Oulipo
http://poj.org/problem?id=3461 (题目链接) 题意 求一个字符串在另一个字符串中出现的次数. Solution KMP裸题,太久没写过了,都忘记怎么求next数组了..水 ...
- ACM -- 算法小结(四)KMP(POJ3461)
KMP -- POJ3461解题报告 问题描述:给出字符串P和字符串T,问字符串P在字符串T中出现的次数 Sample Input 3 BAPC BAPC AZA AZAZAZA VERDI ...
- (模板)poj3461(kmp模板题)
题目链接:https://vjudge.net/problem/POJ-3461 题意:给出主串和模式串,求出模式串在主串中出现的次数. 思路:kmp板子题. AC代码: #include<cs ...
- POJ3461 KMP 模板题
最近忙着考研复习,所以刷题少了.. 数据结构昨天重新学习了一下KMP算法,今天自己试着写了写,问题还不少,不过KMP算法总归是理解了,以前看v_JULY_v的博客,一头雾水,现在终于懂了他为什么要在算 ...
- C++之路进阶——poj3461(Oulipo)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 35694 Accepted: 14424 Descript ...
- poj3461 Oulipo(KMP模板)
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17795 Accepted: 7160 Descripti ...
- POJ3461——Oulipo
1.题目大意:单字符串匹配问题 2.分析:经典KMP问题 存个模板QAQ #include <cstdio> #include <cstdlib> #include <c ...
- 【POJ3461】Olipo
Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...
- poj3461 字符串匹配 熟悉kmp算法第一题
题意: 计算一个字符串在另一个字符串中出现的次数. #include<cstdio> #include<cstring> #include<algorithm> ...
随机推荐
- Android5.1系统WebView内存泄漏场景
问题现象 (该文章,引自零号路的私人博客,本人在浏览框架的开发过程中,用该方式,规避了内存泄露的问题.) 在Android5.1系统中,会发现App存在 WebView 泄漏情况,还比较严重.并且只是 ...
- document.forms[].submit()
document.forms['exportServlet'].submit(); (1)document.forms:表示获取当前页面的所有表单 (2)document.forms[0]:表示获取当 ...
- SUSE(Linux操作系统)
suse linux 即 SUSE (Linux操作系统) . SUSE(发音为/zuz?/),发音的音频文件.SUSE Linux 原来是德国的 SuSE Linux AG公司发行维护的Linux发 ...
- 芝麻HTTP: Scrapy小技巧-MySQL存储
这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接. 只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理 ...
- iOS - Quartz 2D 手势截屏绘制
1.绘制手势截屏 具体实现代码见 GitHub 源码 QExtension QTouchClipView.h @interface QTouchClipView : UIView /** * 创建手势 ...
- JavaScript设计模式(7)-设配器模式
适配器模式 1. 作用: 协调两个不同的接口 2. 适用场景 适配器适用于客户期待的接口与现有 API 提供的接口不兼容这种场景.他只能用来协调语法上的差异问题.适配器所适配的两个方法执行的应该是类似 ...
- 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...
- 【CJOJ2440】大话西游(树链剖分)
题面 Description "大话西游" 是一个在中国非常流行的在线游戏, 由 NIE 公司开发和维护. 这个游戏来源于著名的小说<西游记> 和周星弛的电影, 游戏的 ...
- C#利用substring按指定长度分割字符串
这几天学习分析声音的波形数据,接收到的是十六进制的数据,需要将数据转换成十进制再绘图,这个过程涉及到字符串的分割,正好可以促进自己对C#相关知识的学习.说到分割字符串,我首先想到的是Split,但根据 ...
- 1.4 如何在main()方法之前执行输出“hello world”
public class Test{ static{ System.out.println("hello world"); } public static void main(St ...