题目
字符串(string)
【题目描述】 定义两个字符串A,B相似当且仅当满足以下两个条件中的至少一个: (1)A和B相同; (2)将A分为长度相同的两个子串A0,A1,将B分为长度相同的两个子串B0,B1,满足A0相似于B0,A1相似于B1或A0相似于B1,A1相似于B0。 给定两个字符串S,T,问它们是否相似。 有多组数据。
【输入数据】 第一行一个整数t表示数据组数。 每组数据第一行一个字符串S,第二行一个字符串T,保证它们长度相同。
【输出数据】 每组数据一行,若相似输出YES,不相似输出NO。
【样例输入】
2
abab
baab
aabb
abab
【样例输出】
YES
NO
【数据范围】
对于30%的数据,|S|<=30。
对于60%的数据,|S|<=100。
对于100%的数据,t<=30,∑|S|<=500000。
题解
–一道神坑题
反正也不是很难
就是单纯的恶心而已
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=500005;
int t;
string a,b;
int l;
bool match(int x,int y,int l){
if(l%2==0){
int z=l/2;
return (match(x,y,z)&&match(x+z,y+z,z))||(match(x,y+z,z)&&match(x+z,y,z));
}
else{
bool flag=0;
for(int i=0;i<l;i++)
if(a[x+i]!=b[y+i]){
flag=1;
break;
}
if(flag)
return 0;
return 1;
}
}
int main(){
cin>>t;
while(t--){
cin>>a>>b;
l=a.length();
if(match(0,0,l))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}