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

rhx whj 哈希函数

时间:2024-05-19 15:36 作者:admin 点击:
#include bits/stdc++.h using namespace std; int jz=257; long long m=10000000000007; int geths(char c){ return c-'a'+1; } vectorlong long getqzhs(string s){ vectorlong long v(s.size()+1,0); for(int i=1;i=s.size();i++) v[i]=(v[i-1]*jz+geths(s

#include <bits/stdc++.h>

using namespace std;

int jz=257;

long long m=10000000000007;

int geths(char c){

   return c-'a'+1;

}

vector<long long> getqzhs(string s){

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

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

       v[i]=(v[i-1]*jz+geths(s[i-1]))%m;

   return v;

}

vector<long long> gethzhs(string s){

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

   long long jzs=1;

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

       v[i]=(v[i-1]+geths(s[s.size()-i])*jzs)%m;

       jzs*=jz;

       jzs%=m;

   }

   return v;

}

int main(){

   int n=8;

   string s="11001011";

   string s2=s;

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

       s2[i]='1'==s[i]?'0':'1';

   int ans=0;

   for(int i=1;i<s.size();i++){//0~i-1 i~s.size()-1

       for(int l=1;l<s.size();l++){//优化:循环改二分

           if(i-l<0||i+l>s.size()) break;

           else{

               //字符串截取费时,换成递推哈希值

               string a=s.substr(i-l,l);

               string b=s2.substr(i,l);

               reverse(b.begin(),b.end());

               if(a==b){

                   cout<<a<<" ";

                   ans++;

               }

           }

       }

   }

   cout<<endl<<ans;

   return 0;

}

int main1458(){

   string s="abcdabcdabcd";

   while(cin>>s){

       vector<long long> a=getqzhs(s),b=gethzhs(s);

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

           if(a[i]==b[i]) cout<<i<<" ";

       cout<<endl;

   }

   return 0;

}

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