欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

哈希题目回顾 zxy

时间:2024-05-17 21:42 作者:admin 点击:
#include bits/stdc++.h using namespace std ; int base = 4 ; //进位 int mod = 1000000007 ; //最大的数字 int getcharhs ( char c ){ return c - 'a' + 1 ; } //获取一个字符串的所有前缀哈希值 vector long long getqz ( string s

#include <bits/stdc++.h>

using namespace std;

int base=4;//进位

int mod=1000000007;//最大的数字

int getcharhs(char c){

return c-'a'+1;

}

//获取一个字符串的所有前缀哈希值

vector<long long> getqz(string s){

vector<long long> hs(s.size()+1,0);

for(int i=1;i<=s.size();i++){

hs[i]=(hs[i-1]*base+getcharhs(s[i-1]))%mod;

}

return hs;

}

//获取一个字符串的所有后缀哈希值

vector<long long> gethz(string s){

vector<long long> hs(s.size()+1,0);

long long basepow=base;

hs[s.size()-1]=getcharhs(s[s.size()-1]);

for(int i=s.size()-2;i>=0;i--){

hs[i]=(getcharhs(s[i])*basepow+hs[i+1])%mod;

basepow*=base;

basepow%=mod;

}

return hs;

}

//获取任意一段子串的哈希值

long long getstrhs(vector<long long> hs,int l,int r){

long long basepow=round(pow(base,(r-l+1)));

basepow%=mod;

return hs[r]-hs[l-1]*basepow;

}

int main(){

string s ="11001010";

string fs="";

for(int i=0;i<s.size();i++) fs[i]=(s[i]=='1'?'0':'1');

vector<long long> a=getqz(s),b=getqz(fs);

long long ans=0;

for(int i=1;i<s.size();i++){//确定实际查找范围:左<-i->右 下标0~s.size()-1,中轴i,左:0~i-1,右:i~s.size()-1

int leftl=i-1,rightl=s.size()-1-i+1;

int l,r=i;

if(leftl>=rightl) l=leftl-rightl;

else l=0;

while(l<r){

int mid=(l+r)/2;

int li=i-1-mid;

if(getstrhs(a,mid,i-1)==getstrhs(b,i,i+li)) r=mid;

else l=mid+1;

}//反对称子串数量=k~i字符数量

ans+=i-l;//累加

}

return 0;

}

作业:完成1462题,准备好kmp算法的标准代码。

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%