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) |