提交时间:2022-07-19 11:51:59
运行 ID: 52300
#include<bits/stdc++.h> using namespace std; int kmp[10000010]; int la,lb,j,t; char a[10000010],b[10000010],a1[10000010]; int c[10000010],cnt,cnt1,c1[10000010]; void KMP() { j=0; la=strlen(a+1); lb=strlen(b+1); for(int i=1;i<=la;i++) a[la+i]=a[i]; la+=la; for(int i=2;i<=lb;i++) { while(j&&b[i]!=b[j+1]) { j=kmp[j]; } if(b[j+1]==b[i]) { j++; } kmp[i]=j; } j=0; for(int i=1;i<=la;i++) { while(j>0&&b[j+1]!=a[i]) j=kmp[j]; if(b[j+1]==a[i]) j++; if(j==lb) { c[cnt]=i-lb; j=kmp[j]; cnt++; } } } void KMP1() { j=0; // la=strlen(a+1); // lb=strlen(b+1); // for(int i=1;i<=la;i++) a[la+i]=a[i]; // la+=la; for(int i=2;i<=lb;i++) { while(j&&b[i]!=b[j+1]) { j=kmp[j]; } if(b[j+1]==b[i]) { j++; } kmp[i]=j; } j=0; for(int i=1;i<=la;i++) { while(j>0&&b[j+1]!=a1[i]) j=kmp[j]; if(b[j+1]==a1[i]) j++; if(j==lb) { c1[cnt1]=i-lb; j=kmp[j]; cnt1++; } } } int main() { scanf("%d",&t); while(t--) { cnt=cnt1=0; cin>>a+1; cin>>b+1; int x,y; scanf("%d%d",&x,&y); cnt=0; bool flag=false; KMP(); int d=(max(x,y)-min(x,y))%lb; for(int i=1;i<=la;i++) a1[i]=a[la-i+1]; KMP1(); // for(int i=0;i<cnt;i++) cout<<c[i]<<" "; if(lb%d!=0&&(cnt!=0||cnt1!=0)) { printf("yes\n"); continue; } else { for(int i=0;i<cnt;i++) { if(c[i]%d==0) { flag=true; break; } } if(flag==true) { printf("yes\n"); continue; } for(int i=0;i<cnt1;i++) { if((c1[i]+x)%d==0||(c1[i]-(x%lb)+lb)%d==0||(c1[i]+y)%d==0||(c1[i]-(y%lb)+lb)%d==0) { flag=true; break; } } if(flag==true) { printf("yes\n"); continue; } else { printf("no\n"); continue; } } } }