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 ...
随机推荐
- webpack从0到1超详细超基础学习教程
概念 自己是一个一听到webpack就头大,看着一堆不知道那是什么玩意的东西总觉得自己做好前端就行了,但是在使用vue-cli的时候总觉得要改其中的一些东西进行项目初始化的时候能够更好使用!所以想要根 ...
- vue+element 表单封成组件(2)
今天我们继续把时间选择器,多选框和单选框加上 父组件(在昨天的基础上增加): <template> <el-form :model="ruleForm" ref= ...
- Nginx + uWSGI部署中的一些小坑
1.invalid host in upstream报错 重新启动nginx : sudo /etc/init.d/nginx restart 原因是在配置负载均衡nginx.conf配置文件时,发现 ...
- AJAX 的 Ajax返回数据之前的loading等待效果(gif效果等)
首先,我们通过ajax请求,向后台传递参数,然后后台经过一系列的运算之后向前台返还数据,我希望在等待数据成功返还之前可以展示一个loading.gif图 不废话,在页面上执行点击事件(<a sc ...
- 误删除所有redo日志的一组成员的处理过程
系统中共有3个日志文件组,每个组中各有一个日志文件成员.往系统中添加一个日志文件组,组中日志文件成员数量是2.SQL> alter database add logfile group 4 (' ...
- linux命令行界面如何安装图形化界面
linux命令行界面如何安装图形化界面 目录 问题描述 解决方案 安装包 测试是否安装成功 如何卸载图形化界面 遭遇问题 问题描述 当我们在安装Linux系统时,我们一开始可能安装的是非图形界面的系统 ...
- 项目测试中发现产品bug怎么办
我所在的产品线,并非公司最大最强的产品 甚至为了推广我们这个产品,一般会拿给客户先免费试用 而在试用之前,是要经过一番通测的,测得很急,测得很快 所以产品bug非常多 那么在测试项目的时候,自然会发现 ...
- HTML实体符号代码
1. 特色的 © © © 版权标志 | | 竖线,常用作菜单或导航中的分隔符 · · · 圆点,有时被用来作为菜单分隔符 ↑ ↑ ↑ 上箭头,常用作网页“返回页面顶部”标识 € € € 欧元标识 ...
- 数据采集实战:通过Python获取和分析Google趋势中Covid-19的关注程度
在传染病研究领域,社交媒体数据已被证明可作为预测感冒和流感季节的发作和进展的指标.在本文中,我们将使用Google Trends API来衡量与冠状病毒的状态.我们将使用python谷歌趋势API p ...
- mongo密码的设置
MongoDB 版本 v4.0.7 系统 Win10 注意: 要为数据库创建用户,必须先切换到相应的数据库: 要为数据库创建用户,必须先切换到相应的数据库: 要为数据库创建用户,必须先切换到相应的数据 ...