Code Forces 559 B. Equivalent Strings(递归)

Description
定义两个字符串“相等”有以下两种情况:
1.两字符串完全相同
2.将a,b串分别均分成两个子串a1,a2,b1,b2,则当a1与b1“相等”且a2与b2“相等”或者当a1与b2“相等”且a2与b1“相等”时,a和b“相等”
现给出两字符串,判断其是否“相等”
Input
两个字符串
Output
若两串“相等”则输出YES,否则输出NO
Sample Input
aaba
abaa
Sample Output
YES
Solution
递归处理,注意当字符串长度为奇数时就不用递归直接比较两串字典序即可
Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define maxn 222222
char a[maxn],b[maxn];
bool cmp(int s1,int e1,int s2,int e2)
{
    bool flag=true;
    for(int i=s1,j=s2;i<=e1;i++,j++)
        if(a[i]!=b[j])
            return false;
    return true;
}
bool solve(int s1,int e1,int s2,int e2)
{
    if((e1-s1+1)%2)
        return cmp(s1,e1,s2,e2);
    int mid1=(s1+e1)>>1,mid2=(s2+e2)>>1;
    return solve(s1,mid1,s2,mid2)&&solve(mid1+1,e1,mid2+1,e2)||solve(s1,mid1,mid2+1,e2)&&solve(mid1+1,e1,s2,mid2);
}
int main()
{
    scanf("%s%s",a,b);
    int len1=strlen(a),len2=strlen(b);
    int flag;
    if(len1!=len2)
        flag=0;
    else
        flag=solve(0,len1-1,0,len1-1);
    if(flag)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
    return 0;
}

你可能感兴趣的:(Code Forces 559 B. Equivalent Strings(递归))