相似字符串

题目描述

自动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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值