POJ 3461 Oulipo KMP算法(模板)
题意:
给两组字符串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算法(模板)的更多相关文章
- [POJ] 3461 Oulipo [KMP算法]
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23667 Accepted: 9492 Descripti ...
- POJ 3461 Oulipo KMP算法题解
本题就是给出非常多对字符串,然后问一个字符串在另外一个字符串出现的次数. 就是所谓的Strstr函数啦. Leetcode有这道差点儿一模一样的题目. 使用KMP算法加速.算法高手必会的算法了. 另外 ...
- POJ 3461 Oulipo KMP
题意:统计其中一个子串的出现次数 题解:即KMP算法中j==m的次数 //作者:1085422276 #include <cstdio> #include <cmath> #i ...
- POJ 3080 Blue Jeans、POJ 3461 Oulipo——KMP应用
题目:POJ3080 http://poj.org/problem?id=3080 题意:对于输入的文本串,输出最长的公共子串,如果长度相同,输出字典序最小的. 这题数据量很小,用暴力也是16ms,用 ...
- POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)
题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...
- 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 ...
- POJ 3461 Oulipo(乌力波)
POJ 3461 Oulipo(乌力波) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] The French autho ...
- hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...
- POJ 3461 Oulipo[附KMP算法详细流程讲解]
E - Oulipo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
随机推荐
- C++银行储蓄程序代码
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 文件传送协议FTP
文件传送协议FTP 1.1.概述 文件传送协议 FTP (File Transfer Protocol) 是因特网上使用得最广泛的文件传送协议. FTP 提供交互式的访问,允许客户指明文件的类型与格式 ...
- github浏览器无法访问,并且idea无法push项目
github浏览器无法访问,并且idea无法push项目 原因:前一晚还能正常访问github,今天就无法提交项目了.前一步的操作为删库,然后改库.估计是因为dns出现了问题,具体问题不知道. 网上一 ...
- Java 设置Excel数据验证
数据验证是Excel 2013版本中,数据功能组下面的一个功能,在Excel2013之前的版本,包含Excel2010 Excel2007称为数据有效性.通过在excel表格中设置数据验证可有效规范数 ...
- jquery-购物车js
购物车示例js,为了方便参考,页面写的比较简单.示例如下图所示: html代码如下: <!doctype html> <html lang="en"> &l ...
- notepad++ 字符处理: 字符前后删除 或 删除未包含字符串的行
字符串前后删除 删除str之后的所有字符用,打开替换(Ctrl+H) :str.*$ 删除str之前的所有字符用:^.*str 如果是其他字符就把str替换为其他字符 ---------------- ...
- ASP.NET Core中的Http缓存
ASP.NET Core中的Http缓存 Http响应缓存可减少客户端或代理对web服务器发出的请求数.响应缓存还减少了web服务器生成响应所需的工作量.响应缓存由Http请求中的header控制. ...
- 分享一个基于Net Core 3.1开发的模块化的项目
先简单介绍下项目(由于重新基于模块化设计了整个项目,所以目前整个项目功能不多) 1.Asp.Net Core 3.1.2+MSSQL2019(LINUX版) 2.中间件涉及Redis.RabbitMQ ...
- 整合Kafka+Flink 实例(第二部分 设计思路)
前 言 拖了蛮久了,一直说要接着上一部分写设计思路以及代码,因为自己技术底子薄弱,加上人又懒,所以一直没能继续,今天补上设计思路及部分代码,后面有时间我会再补充一些应用性的功能,的确有些忙,希 ...
- "长辈牌"电子产品:有一种评论朋友圈叫给你打电话
一.长辈们使用电子产品的姿势集合 先问你一个问题:「怎么下载搜狗输入法?」 (非广告) 摁?看到这篇文章的你可能都有点懵,不就下载安装就完了吗?但是,真的就只是这样吗? 前一段时间,当家里的长辈问到我 ...