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

1458:Seek the Name, Seek the Fame

时间:2024-05-17 19:17 作者:admin 点击:
#include bits/stdc++.husing namespace std;int mod=1000000007;//最大值int base=257;//进制数位//单个字符哈希值int getcharhs(char c){ return c-'a'+1;}//字符串前缀哈希值vectorlong long getprefix(string s){ vectorlong long
#include <bits/stdc++.h>
using namespace std;
int mod=1000000007;//最大值
int base=257;//进制数位
//单个字符哈希值
int getcharhs(char c){
    return c-'a'+1;
}
//字符串前缀哈希值
vector<long long> getprefix(string s){
    vector<long long> hashs(s.size()+1,0);
    long long basepow=base; //基本幂次
    hashs[0]=0;
    //从前向后
    for(int i=1;i<=s.size();i++){
        hashs[i]=(hashs[i-1]*basepow+getcharhs(s[i-1]))%mod;
        //a=1 ab=1*257+2=259 abc=259*257+3
    }
    return hashs;
}
//字符串后缀哈希值
vector<long long> getsuffix(string s){
    vector<long long> hashs(s.size()+1,0);
    long long basepow=base; //基本幂次
    hashs[s.size()-1]=getcharhs(s[s.size()-1]);
    //从后向前
    for(int i=s.size()-2;i>=0;i--){
        hashs[i]=(hashs[i+1]+getcharhs(s[i])*basepow)%mod;
        //d=4 cd=4+c*257 bcd=4+c*257+b*257^2
        basepow*=base;
        basepow%=mod;
    }
    return hashs;
}
int main(){
    string s="abcdabcd";
    while(cin>>s){
        vector<long long> a=getprefix(s);
        vector<long long> b=getsuffix(s);
        for(int i=1;i<=s.size();i++)
            if(a[i]==b[s.size()-i]) cout<<i<<" ";cout<<endl;
    }
    return 0;
}


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