#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;