题意:

给两组字符串a和b,求a在b中出现的次数

关于KMP: 马拉车算法是处理回文串,而KMP是处理前后缀的相同字符串的最长长度。

a | a | b | a | a | f | a | a 数组 p [ ] 下标为 i

a | a | b | a | a | c 数组 t [ ]下标为 j

-1| 0 | 1 | 0 | 1 | 2 next [ ] shu数组的值

比较这两组字符串,当p[5]!=t[5]时,如果暴力,那么 i 回溯到1,j 回溯到0,重新比较,可是在之前比较过的0~4下标的字符串是相等的,如果知道了这段字符串的前后缀最长相同字符串的长度,这段 t [ ] 的前缀 和 p [ ]的后缀就不用在比较了,因为他们相同,直接比较 t[2]和p[5]就可以了,如果相同就 j++,不同就查找 t[0] ~t[1]的前后缀最长相同字符串的长度,也就比较t [1]和p[5],以此类推,如果第一个字符和p[i]都不相等,那么i++。

问题来了,求next [ ]数组,它可以列举出以t[0]开头的所有子串,求这些子串的前后缀最长相同字符串的长度,然后整体向右移动一位,开头为-1。

还有一种递推的方法:

void getnext()
{
memset(nex,0,sizeof(nex));
L2=strlen(s2);
int i=0,j=-1;
nex[0]=-1;
while(i<L2)
{
if(j<0||s2[i]==s2[j])//s2[i]为后缀,s2[j]为前缀
nex[++i]=++j;
else
j=nex[j];
}
}

看代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s2[10010];
char s1[1000010];
int nex[10010];
int L1,L2;
void getnext()
{
memset(nex,0,sizeof(nex));
L2=strlen(s2);
int i=0,j=-1;
nex[0]=-1;
while(i<L2)
{
if(j<0||s2[i]==s2[j])//s2[i]为后缀,s2[j]为后缀
nex[++i]=++j;
else
j=nex[j];
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s2);
scanf("%s",s1);
getnext();
L1=strlen(s1);
int j=0;
int ans=0;
int i=0;
while(i<L1)
{
while(s2[j]!=s1[i])
{
j=nex[j];
if(j<0)
{
i++;
j=0;
break;
}
} if(s2[j]==s1[i])
{
j++;
i++;
} if(j==L2)
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}

最小循环节

用next[ ]数组计算最小循环节

公式:如果len%(len-next[len])==0,那么最小循环节长度为len-next[len],循环了len/(len-next[len])次

POJ 3461 Oulipo KMP算法(模板)的更多相关文章

  1. [POJ] 3461 Oulipo [KMP算法]

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23667   Accepted: 9492 Descripti ...

  2. POJ 3461 Oulipo KMP算法题解

    本题就是给出非常多对字符串,然后问一个字符串在另外一个字符串出现的次数. 就是所谓的Strstr函数啦. Leetcode有这道差点儿一模一样的题目. 使用KMP算法加速.算法高手必会的算法了. 另外 ...

  3. POJ 3461 Oulipo KMP

    题意:统计其中一个子串的出现次数 题解:即KMP算法中j==m的次数 //作者:1085422276 #include <cstdio> #include <cmath> #i ...

  4. POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用

    题目:POJ3080 http://poj.org/problem?id=3080 题意:对于输入的文本串,输出最长的公共子串,如果长度相同,输出字典序最小的. 这题数据量很小,用暴力也是16ms,用 ...

  5. POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)

    题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...

  6. HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)

    HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...

  7. POJ 3461 Oulipo(乌力波)

    POJ 3461 Oulipo(乌力波) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] The French autho ...

  8. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

  9. POJ 3461 Oulipo[附KMP算法详细流程讲解]

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

随机推荐

  1. win10下安装LoadRunner12汉化包

    1.前提是已经下载LoadRunner安装文件,及已经安装成功: 安装包: 安装成功后,桌面会出现3个图标: 下面,开始安装汉化包: 1.右键点击“HP_LoadRunner_12.02_Commun ...

  2. Python-PhantomJS的安装和使用

    PhantomJS无需浏览器的Web测试: PhantomJS官网下载地址:https://phantomjs.org/download.html 下载PhantomJS zip文件,解压放置在D:\ ...

  3. 峰哥说技术:09-Spring Boot整合JSP视图

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 09  峰哥说技术:Spring Boot整合JSP视图 一般来说我们很少推荐大家在Spring boot ...

  4. webpack安装问题

    在sf进行安装webpack时候,报错如下: 解决方案:npm install webpack-cli -g,如图上

  5. cocoapods安装以及ZXingObjC的安装

    因为项目要用到第三方包ZXingObjC,需要安装cocoapods.下面是我曲折的安装过程. 1.直接在终端内输入: sudo gem install cocoapods 我直接安装成功. 由于国内 ...

  6. mysql数据库远程访问设置方法

    1. 修改方式1代码改表法.  可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库 ...

  7. 3.后台配置、环境变量、日志、异常处理、二次封装Response、路由组件

    目录 环境变量 封装logger 封装项目异常处理 二次封装Response模块 路由组件配置 环境变量 dev.py # 环境变量操作:小luffyapiBASE_DIR与apps文件夹都要添加到环 ...

  8. 【MyBatis笔记】mapper文件的配置以及说明

    <!doctype html>[MyBatis笔记]mapper文件的配置以及说明 figure:last-child { margin-bottom: 0.5rem; } #write ...

  9. linux下查看系统版本

    工作中我们会遇到安装软件需要知道linux是什么发行版本,话不多话上干货(按照我认为常用排序) 1. lsb_release -a 名词解释:LSB (Linux Standard Base) # 如 ...

  10. 【原创】面试官:谈谈你对mysql联合索引的认识?

    引言 本文预计分为两个部分: (1)联合索引部分的基础知识 在这个部分,我们温习一下联合索引的基础 (2)联合索引部分的实战题 在这个部分,列举几个我认为算是实战中的代表题,挑出来说说. 正文 基础 ...