zoukankan      html  css  js  c++  java
  • 字符串的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 }
  • 相关阅读:
    浅谈折半搜索
    NOIP PJ/CSP-J 题目选做
    SDN第五次上机作业
    SDN第四次上机作业
    SDN第三次上机作业
    SDN第二次上机作业
    必看
    关于tensor
    permute与transpose
    1823. 找出游戏的获胜者
  • 原文地址:https://www.cnblogs.com/CXCXCXC/p/4935210.html
Copyright © 2011-2022 走看看