提交时间:2022-07-19 12:09:05

运行 ID: 52412

#include <cstdio> #include <algorithm> #include <vector> #include <cstring> #define FILEIO #ifdef FILEIO FILE *infile=fopen("runes.in","r"), *outfile=fopen("runes.out","w"); #define scanf(x...) fscanf(infile,x) #define printf(x...) fprintf(outfile,x) #endif // FILEIO using std::vector; int Ts,a,b,len,f[500001]; char S[1000001],T[500001]; inline void getf(char S[]) { f[1]=0; for(int i=2;i<=len;++i) { f[i]=f[i-1]; while(f[i] and S[i]!=S[f[i]+1]) f[i]=f[f[i]]; if(S[i]==S[f[i]+1]) ++f[i]; else f[i]=0; } } inline vector<int> check(char S[],char T[],int lens,int lent) { vector<int> res; res.resize(lens); int n=0; for(int i=1,j=1;i<=lens;) { if(S[i]==T[j]) { if(j==lent) { res[n++]=i-j+1; if(f[j]) j=f[j]; else j=1; }else ++i,++j; }else { if(f[j]) j=f[j]; else i+=(j=1); } } res.resize(n); return res; } vector<int> vec; vector<int>::iterator it; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } inline bool func(int k,int c,int p) { return !(k%(gcd(c,p))); } inline int Main() { scanf("%s%s",S+1,T+1); len=strlen(T+1); scanf("%d%d",&a,&b); getf(T); strncpy(S+1+len,S+1,len); vec=check(S,T,len<<1,len); for(it=vec.begin();it!=vec.end();++it) if(func(*it-1,b-a,len)) { printf("yes\n"); return 0; } std::reverse(S+1,S+1+b); std::reverse(S+1+b,S+1+len); strncpy(S+1+len,S+1,len); vec=check(S,T,len<<1,len); for(it=vec.begin();it!=vec.end();++it) if(func(*it-1,b-a,len)) { printf("yes\n"); return 0; } printf("no\n"); return 0; } int main() { scanf("%d",&Ts); while(Ts--) Main(); #ifdef FILEIO fclose(infile); fclose(outfile); #undef scanf #undef printf #endif // FILEIO return 0; }