Rolling Hash
概要
文字列$S$で,連続した部分文字列のハッシュ値を計算する.
計算量
- 前計算: $O(|S|)$
- ハッシュ値計算: $O(1)$
ソースコード
/*HashRolling*/
template<class T> class RollingHash{
public:
vector<T> hash,pow;
RollingHash(vector<T> &A,T base){
int N = (int)A.size();
hash.resize(N+1);
pow.resize(N+1);
pow[0]=1;
for(int i=0;i<N;i++){
hash[i+1]=hash[i]*base+A[i];
pow[i+1]=pow[i]*base;
}
}
T get(int l,int r){
return hash[r]-hash[l]*pow[r-l];
}
};