字符串的hash匹配

  如果要比较字符串是否相等,首先想到的是KMP算法,但是hash更加简洁易于编写,hash的目的是把一串字符转化成一个数字,用数字来比较是否相等。我让mod=912837417 Base=127,防止hash碰撞

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const LL mod=912837417;
 5 const LL Base=127;
 6 char T[5000],P[5000];
 7 LL lenT,lenP;
 8 LL hash[5000]; 
 9 LL base[5000];
10 LL hashP;
11 inline LL query(LL l,LL r){
12     LL ans=(hash[r]-(hash[l-1]*base[r-l+1]))%mod;
13     if(ans<0) ans+=mod;
14     return ans;
15 }
16 int main(){
17     scanf("%s%s",T+1,P+1);
18     lenT=strlen(T+1); lenP=strlen(P+1);
19     base[0]=1;
20     for(int i=1;i<=lenT;i++){
21         base[i]=(base[i-1]*Base)%mod;
22         hash[i]=(hash[i-1]*Base+(LL)(T[i]-'a'+1))%mod;
23         if(i<=lenP) hashP=(hashP*Base+(LL)(P[i]-'a'+1))%mod;
24     }
25     for(int i=1;i<=lenT-lenP+1;i++){
26         LL now=query(i,i+lenP-1);
27         if(now==hashP){
28             cout<<"从第"<<i<<"位开始匹配"<<endl;
29             return 0;
30         }
31     }
32     cout<<"不能匹配"<<endl;
33     return 0;
34 }

 

转载于:https://www.cnblogs.com/CXCXCXC/p/4935210.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值