提交时间:2022-07-19 11:52:06

运行 ID: 52308

#include <bits/stdc++.h> #define ll long long using namespace std; const ll mod1=998244353; const ll mod2=19260817; const int maxn=5e5+5; char str[maxn]; char r[maxn]; struct hsh{ ll a,b; }S[maxn],R[maxn]; int t; ll qpow(ll a,ll b,ll mod){ ll ret=1;while(b){ if(b&1) ret=ret*a%mod; a=a*a%mod;b>>=1; }return ret; } ll inv(ll x,ll mod){ return qpow(x,mod-2,mod); } ll now1,now2; ll pow1[maxn],pow2[maxn]; ll inv1[maxn],inv2[maxn]; int len; void modify(int d){ int l=len-d; //now1 ll ret1=0; ret1+=S[l].a;ret1+=((S[len].a-S[l].a*pow1[d])%mod1+mod1)%mod1*pow1[l]%mod1; ret1=ret1%mod1;now1=ret1; //now2 ll ret2=0; ret2+=S[l].b;ret2+=((S[len].b-S[l].b*pow2[d])%mod2+mod2)%mod2*pow2[l]%mod2; ret2=ret2%mod2;now2=ret2; } int main(){ pow1[0]=pow2[0]=1; inv1[0]=inv2[0]=1; for(int i=1;i<maxn;i++){ pow1[i]=pow1[i-1]*30%mod1;pow2[i]=pow2[i-1]*30%mod2; inv1[i]=inv(pow1[i],mod1),inv2[i]=inv(pow2[i],mod2); } scanf("%d",&t); while(t--){ int a,b; scanf("%s",str+1); scanf("%s",r+1); scanf("%d%d",&a,&b); len=strlen(str+1); int d=__gcd(abs(b-a),len); for(int i=1;i<=len;i++){ S[i].a=(S[i-1].a*30+str[i]-'a')%mod1; R[i].a=(R[i-1].a*30+r[i]-'a')%mod1; S[i].b=(S[i-1].b*30+str[i]-'a')%mod2; R[i].b=(R[i-1].b*30+r[i]-'a')%mod2; } now1=S[len].a,now2=S[len].b; bool yes=0; for(int i=0;i*d<=len;i++){ if(now1==R[len].a&&now2==R[len].b) yes=1; modify(i*d); } if(yes) puts("yes"); else puts("no"); } }