Libre OJ 103 - 用进制哈希法替代KMP

KMP可以用于求一个模式串P在母串T中出现的次数和位置,时间复杂度是O(n + m) (n为P的长度,m为T的长度)。

进制哈希法也可以做到在O(n + m)的时间内求出P在T中出现的次数和位置,而且做法非常简单暴力!

还未了解进制哈希法的可以阅读下面两篇博客:

进制哈希法

进制哈希的性质

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
const int maxn = 1e6 + 6;
const ull base1 = 13331;
const ull base2 = 233333;
char A[maxn], B[maxn];
ull h1[maxn], h2[maxn], p1[maxn], p2[maxn];

ull get_substring_hash(int l, int r, ull *h, ull *p){
	return h[r] - h[l - 1] * p[r - l + 1];
}

int main(){
	scanf("%s%s", A + 1, B + 1);
	int lenA = strlen(A + 1), lenB = strlen(B + 1);
	
	if(lenA < lenB){
		printf("0\n");
	}
	else{
		h1[0] = h2[0] = 0;
		p1[0] = p2[0] = 1;
		for(int i = 1; i <= lenA; ++i){
			h1[i] = h1[i - 1] * base1 + (ull)A[i];
			h2[i] = h2[i - 1] * base2 + (ull)A[i];
			p1[i] = p1[i - 1] * base1;
			p2[i] = p2[i - 1] * base2;
		}
		ull B_hash1 = 0, B_hash2 = 0;
		for(int i = 1; i <= lenB; ++i){
			B_hash1 = B_hash1 * base1 + (ull)B[i];
			B_hash2 = B_hash2 * base2 + (ull)B[i];
		}
		int cnt = 0;
		for(int i = 1; i <= lenA - lenB + 1; ++i){
			ull hash1 = get_substring_hash(i, i + lenB - 1, h1, p1);
			ull hash2 = get_substring_hash(i, i + lenB - 1, h2, p2);
			if(hash1 == B_hash1 && hash2 == B_hash2)
				++cnt;
		}
		printf("%d\n", cnt);
	}
	return 0;
}

以后如果没有或记不住KMP的模板,就可以用进制哈希来替代KMP啦!

### 回答1: libre-plc-master是一个开源的自由软件项目,致力于开发可编程逻辑控制器(PLC)的软件。在工业自动化领域,PLC被广泛用于控制和监控各种生产设备和系统。 libre-plc-master的目标是提供一个开放、灵活的PLC软件解决方案,使用户能够根据自己的需求定制和配置其控制系统。该项目基于开放的标准和协议,允许用户在各种操作系统和硬件平台上运行。 该软件具有模块化的架构,可以扩展和定制其功能。用户可以根据需要添加新的控制逻辑,定义输入输出信号,以及设置各种操作和条件。 libre-plc-master还提供了友好的图形界面,使用户可以轻松地创建和编辑PLC程序。用户可以通过拖放和连接不同的图形元素,来设计他们的控制逻辑和流程。 此外,libre-plc-master还支持在多个PLC之间进行通信和数据交换。它可以与其他PLC和工控系统集成,实现更复杂的控制和监控任务。 总之,libre-plc-master是一个功能强大、灵活、开放的PLC软件解决方案,为用户提供了定制化和集成化的控制系统开发平台。它的开源性质使得用户可以自由地使用、修改和分享软件,从而推动整个工业自动化领域的发展。 ### 回答2: libre-plc-master是一个开源的PLC(可编程逻辑控制器)平台。PLC是一种专门用于控制和监测机械设备和工程系统的计算机控制系统。libre-plc-master是建立在libre-plc项目的基础上的,它采用自由和开放源代码的设计理念,旨在提供一个灵活、可定制和易于使用的PLC解决方案。 libre-plc-master提供了一个基于Web的用户界面,使得用户可以通过任何支持现代浏览器的设备来直接访问和控制PLC系统。这个用户界面友好而直观,可以实现PLC的编程、配置和调试操作。同时,利用该平台,用户可以轻松创建自定义的PLC应用和功能模块,并与其他工程系统进行集成。 libre-plc-master支持多种不同的编程语言和通信协议,使得用户可以根据自己的需要选择最适合的工具和技术来开发和实现PLC系统。此外,该平台还提供了强大的调试和监控工具,帮助用户诊断和解决故障,并及时采取措施修复问题,从而提高系统的可靠性和性能。 总之,libre-plc-master是一个开源的、灵活可定制的PLC平台,它提供了一套完整的工具和功能,使得用户可以更加轻松地开发、配置和管理PLC系统。它的开放性和自由性使得用户能够更自由地探索和推动PLC技术的发展和创新。 ### 回答3: libre-plc-master 是一个开源的、自由的可编程逻辑控制器(PLC)的主控制系统。PLC 是一种电子设备,用于控制和监视在工业环境中的各种设备和过程。libre-plc-master 提供了一种更加灵活和可定制的方式来实现自动化控制。 libre-plc-master 的主要特点包括以下几点: 1. 开源:libre-plc-master 是基于开放源代码的软件,任何人都可以查看和修改其源代码。这使得用户可以自行定制和适应不同的控制需求。 2. 自由:使用 libre-plc-master 不需要支付任何费用,用户可以自由地使用、复制和分发该软件。这使得它成为一种经济实惠的控制解决方案。 3. 可编程性:libre-plc-master 具有强大的编程功能,用户可以使用各种编程语言来编写控制逻辑。这使得用户能够根据具体的应用需求来实现灵活的自动化控制策略。 4. 可扩展性:libre-plc-master 支持多种硬件平台和通信协议,用户可以根据自己的需求选择适合的硬件设备和通信方式。这使得它可以与现有的控制系统和设备无缝集成。 总而言之,libre-plc-master 提供了一个开源、自由、可定制的主控制系统,适用于各种工业自动化应用。它的灵活性和可扩展性使得用户能够根据自己的需求来设计和实现最佳的自动化控制方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值