字符串哈希 - 封装模板

#define MultiHash
namespace STHS{
	#ifdef MultiHash
	struct hash{
		mint a,b;
		hash(ll v=0){a=b=v;}
		hash(ll x,ll y){a=x,b=y;}
		friend hash operator+(hash a,hash b){return a.a+=b.a,a.b+=b.b,a;}
		friend hash operator-(hash a,hash b){return a.a-=b.a,a.b-=b.b,a;}
		friend hash operator*(hash a,hash b){return a.a*=b.a,a.b*=b.b,a;}
		friend bool operator==(hash a,hash b){return a.a==b.a&&a.b==b.b;}
	};
	hash bas={131,13331};
	#else
	typedef mint hash;
	hash bas=131;
	#endif
	struct sths{
		vec<hash> hsh,pw;
		sths(string s=""){
			int len=s.size();
			hsh.resize(len+1),pw.resize(len+1);pw[0]=1;
			rep(i,1,len)hsh[i]=hsh[i-1]*bas+s[i-1],pw[i]=pw[i-1]*bas;
		}
		void init(string s){*this=sths(s);}
		hash get(int l,int r){return hsh[r]-hsh[l-1]*pw[r-l+1];}
		bool same(int la,int ra,int lb,int rb){return get(la,ra)==get(lb,rb);}
	};
	il bool stsame(sths a,sths b,int la,int ra,int lb,int rb){return a.get(la,ra)==b.get(lb,rb);}
}using STHS::sths,STHS::stsame;
posted @ 2026-08-26 20:50  LastKismet  阅读(7)  评论(0)    收藏  举报