【POJ】【P2774】【Long Long Message】【题解】【hash】

本文详细介绍了如何运用哈希算法和二分查找技术解决字符串匹配问题,通过实例展示复杂度为O(nlog²n)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:http://poj.org/problem?id=2774

sth神犇说hash可以干任何字符串的事情……于是我就拿hash乱搞了……原来用hash+二分套hash,然后WAWAWAWA,于是改成hash+二分套二分,A了复杂度O(nlog^2n)

Code:

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
typedef unsigned long long UL;
int len1,len2,mid;
UL hash1[maxn],hash2[maxn],hash_l[maxn],base=2333333;
UL hash[maxn];
char s1[maxn],s2[maxn];
void hash_init(){
	UL val=0;hash_l[0]=1;
	for(int i=1;i<=len1;i++){
		val=val*base+s1[i]-'0';
		hash1[i]=val;
	}val=0;
	for(int i=1;i<=len2;i++){
		val=val*base+s2[i]-'0';
		hash2[i]=val;
	}int maxx=max(len1,len2);
	for(int i=1;i<=maxx;i++)
		hash_l[i]=hash_l[i-1]*base;
}
int main(){
	scanf("%s%s",s1+1,s2+1);
	len1=strlen(s1+1);len2=strlen(s2+1);
	hash_init();
	int l=0,r=min(len1,len2)+1;
	while(l<r){
		mid=(l+r)>>1;
		hash[0]=0;
		for(int i=mid;i<=len1;i++)
		hash[++hash[0]]=(hash1[i]-hash1[i-mid]*hash_l[mid]);
		sort(hash+1,hash+1+hash[0]);
		bool ok=0;
		for(int i=mid;i<=len2;i++){
			UL x=(hash2[i]-hash2[i-mid]*hash_l[mid]);
			if(*lower_bound(hash+1,hash+1+hash[0],x)==x){
				ok=1;break;
			}
		}
		
		if(ok)
			l=mid+1;
		else
			r=mid;
	}printf("%d\n",l-1);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值