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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值