[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> ...
随机推荐
- CAN总线基础知识(三)
1.CAN协议 1.1 帧类型 通讯时使用下面5个类型的帧: 数据帧 遥控帧 错误帧 过载帧 帧间空隙 在所有这些帧中,数据帧和遥控帧由用户设置,而其它帧则由CAN硬件设置. 数据和遥控帧有两种格式: ...
- Linux查看目录中的文件
Linux查看目录中的文件 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ls examples.desktop jdk 公共的 视频 文档 音乐 java ...
- Python Web-第五周-Web Services and XML(Using Python to Access Web Data)
1.Web Service Overview 1.Data on the Web Python Dictionary 和 Java HashMap间需要建立一个桥梁,可以用XML或是JSON 2.XM ...
- es6学习笔记--解构赋值
昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构 ...
- [Shoi2007]Vote 善意的投票
题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来 ...
- [BZOJ1552] [Cerc2007] robotic sort (splay)
Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...
- UNDO及MVCC、崩溃恢复
UNDO特性:避免脏读.事务回滚.非阻塞读.MVCC.崩溃恢复 事务工作流程(图2) MVCC原理机制 崩溃恢复:redo前滚.undo回滚 长事务.大事务:危害.判断.处理 UNDO优化:实现und ...
- 测试一下OpenLiveWriter
$$ \sum_{0}^{n} k_i $$ OpenLiveWriter好丑啊啊啊啊,什么鬼?
- Java中高级面试题
一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): 2)HashMap的底层实现,之后会问Co ...
- python PEP8相关介绍
在学习了python相关技术之后,开始重视其开发规范,以满足代码的可读性以及可维护性.主要的是学习了PEP8-style for python code的相关内容. 代码布局 缩进:每一级4个缩进.连 ...