Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52628 | LinkZelda | 修复符文 | C++ | 通过 | 100 | 10 MS | 1832 KB | 1942 | 2022-07-19 15:23:35 |
#include<cstdio> #include<algorithm> #include<ctype.h> #include<cstring> #include<iostream> #include<vector> #include<queue> #include<ctime> #include<cmath> #include<queue> #include<map> #include<set> #include<unordered_map> #include<stack> #define pr pair<int,int> #define eps 1e-8 #define db double using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) { if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar(); } return x*f; } char s[1000005],t[2000005]; int n,nxt[2000005],tot; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } void solve() { scanf("%s%s",t+1,s+1); n=strlen(s+1); bool ok=0; int a=read(),b=read(),len=abs(a-b); t[n+1]='#'; for(int i=1; i<=n; i++) t[i+n+1]=t[i+2*n+1]=s[i],tot=i+2*n+1; for(int i=2; i<=tot; i++) { int j=nxt[i-1]; while(j&&t[i]!=t[j+1]) j=nxt[j]; if(t[i]==t[j+1]) j++; nxt[i]=j; } int ovo=gcd(n,len); // for(int i=1; i<=tot; i++) // putchar(t[i]); // puts(""); // for(int i=1; i<=tot; i++) // printf("%d ",nxt[i]); // puts(""); for(int i=2*n+1; i<=tot; i++) { if(nxt[i]!=n) continue; if((i-(2*n+1))%ovo==0) { ok=1; break; } } reverse(s+1,s+a+1); reverse(s+a+1,s+n+1); for(int i=1; i<=n; i++) t[i+n+1]=t[i+2*n+1]=s[i],tot=i+2*n+1; for(int i=2; i<=tot; i++) { int j=nxt[i-1]; while(j&&t[i]!=t[j+1]) j=nxt[j]; if(t[i]==t[j+1]) j++; nxt[i]=j; } for(int i=2*n+1; i<=tot; i++) { if(nxt[i]!=n) continue; if((i-(2*n+1))%ovo==0) { ok=1; break; } } // for(int i=1; i<=tot; i++) // putchar(t[i]); // puts(""); puts(ok?"yes":"no"); } int main() { int T=read(); while(T--) solve(); return 0; }