题目描述
自动AC机的开发已经到了测试阶段,郭老师想出了一种奇妙的测试方法。郭老师定义两个字符串和相似,当且仅当满足下列条件之一:
1、和逐字符相等
2、把分成长度相等的两半和,把也分成长度相等的两半和,满足下列条件之一:
(1) 和相似且和相似
(2) 和相似且和相似
现在自动AC机已经判断字符串和字符串相似,请你来验证是否正确。
输入格式
第一行 个整数 ,表示测试数据的组数。
每组测试数据两行,其中:
第一行 个字符串 。
第二行 个字符串 。
数据保证每组测试数据的两个字符串长度相。
输出格式
对于每一组测试数据,在一行中输出验证结果。如果 和 相似输出 YES ,否则输出 NO。
样例
样例输入
2
aaba
abaa
aabb
abab
样例输出
YES
NO
样例解释
第一个样例的第一组测试数据中,对于a=aaba和b=abaa,可以分成a1=aa,a2=ba,b1=ab,b2=aa;其中a1和b2相等。对于a=ba和b=ab,可以分成a1=b,a2=a,b1=a,b2=b;其中a1和b2相等,a2和b1相等。所以aaba和abaa相似。
第一个样例的第二组测试数据中,aabb和abab不满足相似。
数据范围与提示
对于30%的数据,1 ≤ |a| ≤ 200。
对于100%的数据,1 ≤ N ≤ 10,a ≤ |a| ≤ 2 * 。
数据保证字符串a和b仅包含小写英文字母,保证每组测试数据中|a| = |b|。
代码时间
#include<cstdio>
#include<cstring>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int t;
char a[200005],b[200005];
bool check(int x,int y,int X,int Y){
bool flag=false;
for(int i=x,I=X;i<=y,I<=Y;i++,I++){
if(a[i]!=b[I]){
flag=true;
break;
}
}
if(!flag)return true;
if((y-x+1)%2!=0)return false;
return (check(x,(x+y)/2,X,(X+Y)/2)&&check((x+y)/2+1,y,(X+Y)/2+1,Y))||
(check(x,(x+y)/2,(X+Y)/2+1,Y)&&check((x+y)/2+1,y,X,(X+Y)/2));
}
int main(){
// freopen("string.in","r",stdin);
// freopen("string.out","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%s %s",a+1,b+1);
int len=strlen(a+1);
if(check(1,len,1,len))printf("YES\n");
else printf("NO\n");
}
return 0;
}