字符串(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。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
做法:分治
拿到这道题都知道可以写个递归二分。本蒟蒻和另外俩个蒟蒻一起打挂了这道题,爆零。迷之RE还调了一个半小时orz。。。。
具体来说就二分判断,对每一个子串都进行同样的操作,注意可以换位比较(就是题目中b1 == a0,b0 == a1也可以)
代码:
#include<bits/stdc++.h>
using namespace std;
int t; string a,b;
int check(int l1,int r1,int l2,int r2)
{
int len = r1-l1+1;
for(int i = 0;i < len;i++)
{
if(a[i+l1-1] != b[i+l2-1]) goto next;
}
return 1;
next:
if(len%2) return 0;
int half = len/2;
if(check(l1,l1+half-1,l2,l2+half-1) && check(l1+half,r1,l2+half,r2)
|| check(l1+half,r1,l2,l2+half-1) && check(l1,l1+half-1,l2+half,r2)) return 1;
return 0;
}
int main()
{
cin >> t;
while(t--)
{
cin >> a >> b;
int n = a.length();
cout << (check(1,n,1,n) ? "YES" : "NO") << endl;
}
}