规律+DFS Codeforces Round div2 D. Equivalent Strings

http://codeforces.com/problemset/problem/559/B

题意,给出两个字符串,确定,是否相等,定义字符串是否相等为,如果为奇数串,只能比较是否每个字符相同,如果为偶数串,第一个串分成两个相等长度的串为a1 b1,第二个串也分成a2 b2,a1== a2 && b1 == b2 || a1 == b2 && a2 == b2.

思路:

      直接把字符串内部排序。因为,偶数个字符串的,前部分与后部分,是哪个顺序,并不影响这个字符串的大小,所以我们要使一个字符串只有一种表达方法,也就是如果是偶串,则要求,前面的串比后半部分的串要小,这样就可以唯一化了,比第一种方法要快很多倍了。只是在处理字符串上花费时间,复杂度是线性的。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <queue>;
using namespace std;
string minstring(string ss)
{
    string s3,s4;
    if(ss.size()%2==1) return ss;
    s3=minstring(ss.substr(0,ss.size()/2));
    s4=minstring(ss.substr(ss.size()/2,ss.size()/2));
    if(s3<s4) return s3+s4;
    else return s4+s3;
}
int main()
{
    string s1,s2;
    cin>>s1>>s2;
    if(minstring(s1)==minstring(s2)) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值