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 ...
随机推荐
- 启动时查看配置文件application.yml
Spring Boot Application 事件和监听器 在多环境的情况下. 可能需要切换配置文件的一个对应的属性来切换环境 面临的问题就是 如何在springboot加载完配置文件的时候就可以立 ...
- 【Mood】八上期末考
Final exam Day -30 平姐在班会上突然就说了一句,离期末考只有一个月了. 刚从体育节的气氛中脱离出来的我想了想,好像还真的是诶. 又努力地去想了想,好像不太慌张呢. Final ex ...
- sql -- 利用order by 排名作弊
表结构: 需求: 方法1:union ,,) order by user_total desc ) a union (,,) order by user_total desc ) b) 方法2:直接在 ...
- SSRF漏洞的挖掘思路与技巧
什么是SSRF? SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法 ...
- MVC06
1.校验机制 我们可以在Model中使用属性进行校验 using System; using System.ComponentModel.DataAnnotations; using System.D ...
- 它的JS与HTML标签是分离的吗
一个单的利用JS切换图片的功能写法1: <section> <h2>JS切换图片</h2> <ul class="pictable"> ...
- layer打开弹窗时传递参数(content:)
在使用layer打开弹窗时,我希望带一些参数过去,进行某些判断.直接就可以用链接+参数的方式即可. js var userGrade=Mrant layer.open({ title: '权限管理', ...
- CSS 图像拼合技术(雪碧图)
1.css 图像拼合 图像拼合就是单个图像的集合. 有许多图像的网页可能需要很长的时间来加载和生成多个服务器的请求. 使用图像拼合会降低服务器的请求数量,并节省带宽. 代码如下: <!docty ...
- SuperBenchmarker一个用.NET编写的压测工具
0x01 前言 在这之前想必大家对ab(http)与abs(https)也有一些了解,我们今天不去看ab和abs,SuperBenchmarker(sb.exe)是一个压测工具,他是一个受Apache ...
- 简单的猜数字小游戏--Python
猜数字小游戏: #coding=utf-8 import random answer =random.randint(1,100) #生成随机数 n=int (input("Please ...