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 ...
随机推荐
- log4p踩坑总结
log4p可以方便的打印格式化日志,在实际应用时,因没有好好理解官网中的配置文件,导致出错了几次. 现总结如下: 1. 安装 pip3 install log4p 2. 查看配置说明,请参考https ...
- Java入门教程二(语言基础)
常量与变量 常量值又称为字面常量,它是通过数据直接表示 常量 实型常量值 Java 的实型常量值主要有如下两种形式 十进制数形式:由数字和小数点组成,且必须有小数点,如 12.34.-98.0 科学记 ...
- 达拉草201771010105《面向对象程序设计(java)》第十四周学习总结
达拉草201771010105<面向对象程序设计(java)>第十四周学习总结 第一部分:理论知识 布局管理器: 布局管理器是一组类. 实现java.awt.LayoutManager接口 ...
- ORACLE数据库实现主键自增
ORACLE数据库是甲骨文公司的一款关系数据库管理系统. 实现主键自动增长需要四个步骤: 去看 创建表格 去看 创建自增序列 去看 创建触发器 去看 插入测试 1.创建表格(必须有主键) -- 创建学 ...
- Java enum枚举在实际项目中的常用方法
在项目实际开发过程中,经常会遇到对某些固定的值.字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目 ...
- js实现图片的懒加载
原文地址:https://blog.phyer.cn/article/9277.欢迎大家访问我的博客(●ˇ∀ˇ●) // 防抖 let lazy_timer; window.addEventListe ...
- 《数字信号处理》课程实验2 – FIR数字滤波器设计
一.FIR数字滤波器设计原理 本实验采用窗函数法设计FIR数字低通滤波器.我们希望设计的滤波器系统函数如下: \(H_{d}\left( e^{jw} \right) = \left\{ \begi ...
- 一起了解 .Net Foundation 项目 No.16
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Orchard CMS O ...
- Function.prototype.call.apply()方法
在看uncurrying化函数时候,碰到了Function.prototype.call.apply()的用法: 先说说uncurrying()函数: Function.prototype.uncur ...
- MyISAM 和 InnoDB
1.MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级 ...