Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52552 | 野兽先辈——田所浩二 | 修复符文 | C++ | 通过 | 100 | 5 MS | 1336 KB | 974 | 2022-07-19 12:59:32 |
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=5e5+5; int T,n,m,a,b,nex[N]; char s[N],t[N],tt[N]; void init() { for(int i=1; i<=n; i++) nex[i]=0; int j=0; for(int i=2; i<=n; i++) { while(j&&s[j+1]!=s[i]) j=nex[j]; if(s[j+1]==s[i]) j++; nex[i]=j; } } bool solve(char b[]) { int j=0; for(int i=1; i<=n; i++) { while(j&&s[j+1]!=b[i]) j=nex[j]; if(s[j+1]==b[i]) j++; } for(int i=j+1; i<=n; i++) if(s[i]!=b[i-j]) return 0; return (n-j)%m==0; } int gcd(int x,int y) { if(!y) return x; return gcd(y,x%y); } int main() { scanf("%d",&T); while(T--) { scanf("%s%s%d%d",s+1,t+1,&a,&b); n=strlen(s+1); m=a>b ? a-b:b-a; m=gcd(n,m); memcpy(tt,t,sizeof(t)); reverse(tt+1,tt+a+1); reverse(tt+a+1,tt+n+1); if(solve(t)||solve(tt)) puts("yes"); else puts("no"); } return 0; }