Round #313 (Div. 2) D. Equivalent Strings-大水题递归

题目大意:给出两串长度相等的字符串a,b,问其是否为等价字符串。

                  判断依据为:1.两个字符串相等。

                                        或 2.把每个字符串拆分成长度相等的两个子串:a=a1+a2,b=b1+b2,如果a1=b2且a2=b1或者a1=b1&&a2=b2 ,则a与b等价

深搜递归判断子串是否等价,子串等价,主串就一定等价。注意子串长度相等的条件,不满足不能拆。

如此大的水题。。居然没看到。。。以后做题一定得快点。。。才有机会做后面的题。。

  有个要注意的细节是,如果用这种暴力的方法做这题

递归的时候 递归顺序  如果是 



	if 		(cmp(len/2,a1,b2)&&cmp(len/2,a2,b1))
		return 1; 
	if  	((cmp(len/2,a1,b1)&&cmp(len/2,a2,b2)))
 		return 1;
就ac 

如果2个if的顺序反了。。就是TLE ON TEST 89.......应该是这个数据太大。。递归两遍就超时了,这是之后才发现的,估计当时用暴力没过的人真是被坑了。。。


当然这种方法毕竟太暴力了,应该用更优的算法:

因为根据题目“等价”的性质,可以知道 1个个字符串,把他的两个子串互换位置是影响“等价性”的,

因此我们可以规定,一个字符串不断做这样的更换(把字典序小的子串放在前,大的在后)  直到子串长度为奇数

最后直接比较经过这样操作的a与b即可知道等不等价;




暴力法代码:


 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define INF 0x7f7f7f7f
const __int64 maxn = 200005; 


string a;
string b;
 
 string tmp;
int cmp(int len,string s1,string s2)
{
 if (s1==s2) return 1;
	if (len%2) 
			return 0;

	string	a1=s1.substr(0,len/2);
	string	a2=s1.substr(len/2,len/2);  
	string	b1=s2.substr(0,len/2);
	string	b2=s2.substr(len/2,len/2);

	if 		(cmp(len/2,a1,b2)&&cmp(len/2,a2,b1))
		return 1; 
	if  	((cmp(len/2,a1,b1)&&cmp(len/2,a2,b2)))
 		return 1;

	
	
	return 0;

}
 

int main()
{  
	//	freopen( "pulp.in","r",stdin );  //scanf 从1.txt输入
	//  freopen( "pulp.out","w",stdout );  //printf输出到1.tx
	
cin>>a;
cin>>b;

 

 	int flag=cmp(a.size(),a,b);
 	if (flag) 
		printf("YES\n");
 	else
		printf("NO\n");
	
	return 0;
}

优化法代码:

 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define INF 0x7f7f7f7f
const __int64 maxn = 200005; 


string a;
string b; 
string order(string s1)
{
	
	int len=s1.size();
	if (len%2) return s1;	//长度为奇数不能再分,包括1
	string	a1=s1.substr(0,len/2);
	string	a2=s1.substr(len/2,len/2);  
	
	string r1=order(a1);
	string r2=order(a2);
	if (r1<r2)
		return r1+r2;
	else 
		return r2+r1;

 

}
 

int main()
{  
	//	freopen( "pulp.in","r",stdin );  //scanf 从1.txt输入
	//  freopen( "pulp.out","w",stdout );  //printf输出到1.tx
	
cin>>a;
cin>>b;

 

  
 	if (order(a)==order(b)) 
		printf("YES\n");
 	else
		printf("NO\n");
	
	return 0;
}

你可能感兴趣的:(Round #313 (Div. 2) D. Equivalent Strings-大水题递归)