KMP算法

【KMP算法详解——适合初学KMP算法的朋友】 KMP算法的初级体验,只为抛砖引玉之用 阅读详情
Problem Description
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book:

Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un non-dit : la vision, l’avision d’un oubli commandant tout, où s’abolissait la raison : tout avait l’air normal mais…

Perec would probably have scored high (or rather, low) in the following contest. People are asked to write a perhaps even meaningful text on some subject with as few occurrences of a given “word” as possible. Our task is to provide the jury with a program that counts these occurrences, in order to obtain a ranking of the competitors. These competitors often write very long texts with nonsense meaning; a sequence of 500,000 consecutive 'T's is not unusual. And they never use spaces.

So we want to quickly find out how often a word, i.e., a given string, occurs in a text. More formally: given the alphabet {'A', 'B', 'C', …, 'Z'} and two finite strings over that alphabet, a word W and a text T, count the number of occurrences of W in T. All the consecutive characters of W must exactly match consecutive characters of T. Occurrences may overlap.

Input
The first line of the input file contains a single number: the number of test cases to follow. Each test case has the following format:

One line with the word W, a string over {'A', 'B', 'C', …, 'Z'}, with 1 ≤ |W| ≤ 10,000 (here |W| denotes the length of the string W).
One line with the text T, a string over {'A', 'B', 'C', …, 'Z'}, with |W| ≤ |T| ≤ 1,000,000.
Output
For every test case in the input file, the output should contain a single number, on a single line: the number of occurrences of the word W in the text T.

Sample Input

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

Sample Output

1
3
0

 

这是一道考KMP的算法题,需要注意的是当匹配了一个模式串P后,如何选择i和j。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <iostream>

using namespace std;

char T[1000010], P[10010];
int  f[10010];

void KMPFailureFunction()
{
	int i, j;
	int m = strlen(P);

	i = 1;
	j = 0;
	while(i < m)
	{
		if(P[j] == P[i])
		{
			f[i] = j + 1;
			++i;
			++j;
		} else if(j > 0)
			j = f[j - 1];
		else {
			f[i] = 0;
			++i;		
		}
	}
}

int KMP()
{
	KMPFailureFunction();

	int ans = 0;
	int i, j;
	int n = strlen(T);	
	int m = strlen(P);

	i = 0;
	j = 0;
	while(i < n)
	{
		if(P[j] == T[i])
		{
			if(j == m-1)
			{
				ans++;
				++i;
				j = f[j];

			} else {
				++i;
				++j;
			}
		} else if(j > 0)
			j = f[j - 1];
		else ++i;
	}

	return ans;
}


int main()
{
	//freopen("data_B.txt", "r", stdin);
	int t;
	scanf("%d", &t);
	
	while(t--)
	{
		scanf("%s%s", P, T);
		printf("%d\n", KMP());
	}
	
	return 0;
}




【原创工具 | OpenCV-CamCalib】一个基于 OpenCV 的自动化相机数据采集和标定程序 一个基于OpenCV的自动化相机数据采集和标定程序。系统内置相机地址默认为 0。 阅读详情

相关推荐

硬全桥副边钳位管Vds电压凸台揭秘——寄生参数引发的导通异常

本文深入分析了硬全桥副边钳位管Vds电压凸台现象,揭示了寄生参数如何引发导通异常。通过波形分析和工程实践,详细解析了走线电感的蓄能效应和体二极管的接力作用,并提供了PCB布局优化、元件选型和驱动电路调整等解决方案,帮助工程师有效应对这一常见问题。

weixin_30825581的博客 428

《数据结构》:KMP算法

字符串的基本操作之一是find()函数,即从某一个字符串中找到对应的子串位置。KMP算法是目前为止最为广泛使用的寻找子字符串的算法。

qq_45436186的博客 641

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

KMP算法真的搞死人,终于搞懂了

现总结如下: 想理解KMP算法就要先看看最原始的模式匹配int match(char *string, char *pat)  //原模式匹配函数...{    int i = 0, j = 0;    while (i  strlen(string) && j  strlen(pat))  ...{        if (sting[i] == pat[j]) ...{         

http://w3er.com/ 2647

STM32实战:电容触摸屏I2C转USB HID设备全解析

本文详细解析了基于STM32的电容触摸屏I2C转USB HID设备实现方案。通过硬件选型、协议分析和代码实现,展示了如何将GT911触摸屏数据转换为标准USB HID协议,并提供了关键调试经验与性能优化技巧,为智能家居控制面板等应用提供高性价比解决方案。

weixin_42548829的博客 320

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2314

KMP算法基本原理

KMP算法基本原理 KMP算法是根据三位作者(D.E.Knuth,J.H.Morris和V.R.Pratt)的名字来命名的,算法的全称是Knuth Morris Pratt算法,简称为KMP算法。 KMP算法的核心思想,跟上一节讲的BM算法非常相近。我们假设主串是a,模式串是b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望 找到一些规律,可以将模式串往后多滑动几位,跳过那些肯...

qq_43954210的博客 3082

ANSYS CFX 自定义函数数据导入实战指南

本文详细介绍了在ANSYS CFX中实现自定义函数数据导入的完整流程与实战技巧。通过具体案例,指导用户如何将外部实验或计算数据(如材料属性随温度变化)导入CFX,创建可调用的函数,并正确关联到仿真模型中,从而显著提升仿真的真实性与准确性。

v6b7n8m9q0的博客 702

KMP匹配算法中的失效函数

今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便失效函数:设模式 P=p0p1....pm-2pm-1, 则它的失效函数定义如下:f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=pj-kpj-k+1...pj 的最大数f(j)= -1 | 其它情况。 j 0 1 2 3 4 5 6 7 p a b a ...

weixin_30776273的博客 989

OpenHarness代码解读

Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。

qq_52053775的博客 187

分享6款文字语音生成驱动虚拟数字人说话的开源项目

对定性和定量结果的大量实验表明,我们的算法实现了高质量的照片真实感对话头部视频,包括根据语音节奏进行的各种面部表情和头部运动,并超过了最先进的水平。我们的系统包含三个阶段。当然,FACEGOOD Audio2face 部分也可根据自己的喜好进行重新训练,比如你想用自己的声音或其它类型的声音,或者不同于 FACEGOOD 使用的模型绑定作为驱动数据,都可以根据下面提到的流程完成自己专属的动画驱动算法模型训练。兼顾生成的韵律和外表的相似,除了面部,考虑到了头部的动作,虑了背景区域的artifact。

南七小僧的学海无涯 3048

KMP算法详解

KMP算法是一种字符串模式匹配算法,不同的来源讲解方式也不一样,很容易混乱,在这里以一种特殊的方式来讲解KMP算法,希望大家不再被这个问题所困扰。 一. 一些基础问题 什么是字符串的模式匹配? 给定两个串S=“s1s2s3 …sn”和T=“t1t2t3 …tn”,在主串S中寻找子串T的过程叫做模式匹配,T称为模式。 如何寻找? 我们先从比较好理解的暴力匹配(朴素模式匹配BF算法)开始,进而引出K...

yyzsir的博客 9万+

OpenCV-Python实战(26)——复杂场景下的实时物体检测与跟踪

本节介绍了一种鲁棒的特征跟踪方法,该方法速度足够快,能够实时应用于网络摄像头的视频流。首先,算法展示了如何在一幅图像中提取和检测重要特征——无论是我们感兴趣的模板图像(训练图像),还是预期包含该物体的更复杂场景(查询图像),这些特征都具有视角和尺寸不变性。然后对关键点进行聚类,找到两幅图像中特征点之间的匹配。在此基础上,可以计算出一个将一组特征点映射到另一组的透视变换矩阵。利用这些信息,我们可以在查询图像中勾勒出训练图像的轮廓,并对查询图像进行透视变换,使感兴趣的物体以直立状态显示在屏幕中央。

盼小辉丶的博客 1890

图解算法:KMP算法

目录第一章 暴力匹配实现第二章 KMP算法介绍第三章 KMP算法原理第四章 KMP的匹配表第五章 KMP算法实现 项目地址:https://gitee.com/caochenlei/algorithms 第一章 暴力匹配实现 【问题描述】 有一个字符串 str1 = “BBC ABCDAB ABCDABCDABDE”,和一个子串 str2 = “ABCDABD”,现在要判断 str1 是否含有 str2,如果存在,就返回第一次出现的位置,如果不存在,就返回-1。 【问题思路】 【代码实现】 publ

轻松的小希 8311

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

kmp算法总结

搞ACM也有三年了,期间学习了不少算法,到12月把上海站打完也要成退役狗了。最近突然想把学过的一些算法回过头来好好总结一下,于是就有了我的算法总结系列。这是这个系列的开端,所以先写一个简单点的算法,以后会慢慢复习一些复杂的算法,最后还是希望自己能够坚持下去吧。 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对

ddyyxx的程序员之路 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

kmp算法详解

从头到尾彻底理解KMP 此文转自神的博客  http://blog.youkuaiyun.com/v_july_v/article/details/7041827# 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言     本KMP原文最初写于2

楠先生 4万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大话 KMP 算法

LeetCode上有一题,简单难度的,以下是原题 这个题目应该刷LeetCode的同学大部分都刷到过,比较荒谬的是可以直接用 indexOf 方法实现,并且是最优的解法,看到评论以后一片哗然,大家扯到最多的是这道题就应该用KMP来做,如果用KMP做那这道题应该是困难级别的。所以看了这些评论以后,决定自己去摸索一下KMP的算法,以及大概其实现原理。 网上找了很多关于解释KMP算法的...

lmx125254的博客 3833

kmp算法和kmp的优化

一、kmp是什么 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 简单来...

harry12138小白的博客 1497

算法 kmp算法

kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同。下面具体说下这两种算法的区别:主串:BABCDABABCDABCED从串:ABCDABCEDBF算法:第一步:BABCDABABCDABCEDA               从主串的第一个字符位置开始与从串第一个字符位置进行匹配,匹配失败第二步:BABCDABABCDABCED ABCDAB...

夜雨柠檬 833
上一篇: 烦人的幻灯片(类拓扑排序)
下一篇: ACdream 同心树
liulingbo918
博客等级 码龄14年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值