Equivalent String

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84562#problem/E
题意:

       给定两组字符串a和b(由小写字母构成),判断是否相等。相等条件如下:

       1)若a和b为奇数字符串,只需判断字符串是否一致;

       2)若a和b为偶数字符串,可将字符串分为长度相等的两部分,再进行比较。如将a分为长度相等的a1和a2两部分,将b分为长度相等的b1和b2两部分,若a1与b1相等且a2与b2相等,或者a1与b2相等且a2与b1相等,则a与b相等。
案例:

       Input

   aaba

abaa
      Output
   YES
       Input
   aabb

abab
      Output
   NO


分析:

       奇数字符串与偶数字符串条件判断有所差异,但可以考虑将偶数字符串不断拆分,最终成为奇数字符串与奇数字符串的比较(比如字符长度为6的两字符串之间进行比较,可以拆分为3+3两部分,再根据相等条件进行比较,又如字符串长度为8的两字符串之间进行比较,单个字符串可以先拆分为4+4,再将每部分拆分为2+2,2为偶数重复刚才的步骤2拆分为1+1再根据等价条件进行比较),如此一来,采用DFS及暴力求解得出最终结果。阐述不清,阅览如下具体步骤可知。
源代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 # define maxn 200000
 6 char a[maxn],b[maxn];
 7 int dfs(char *m,char *n,int len)
 8 {   
 9     int k=0;
10     if(len%2==1)//判断奇数字符串是否相等
11     {
12         for(int i=0;i<len;i++)
13         {   if(m[i]!=n[i])//k值判断字符串中不等字符个数
14                k++;
15         }
16         if(!k)    return 1;
17         else return 0;
18     }
19     else//判断偶数字符串
20     {
21         if((dfs(m,n,len/2)&&dfs(m+len/2,n+len/2,len/2))||(dfs(m+len/2,n,len/2)&&dfs(m,n+len/2,len/2)))//偶数字符串相等判断条件
22             return 1;
23         else return 0;
24     }
25 }
26 int main()
27 {   
28     scanf("%s%s",a,b);//输入字符串
29     if(dfs(a,b,strlen(a)))//判断字符串相等
30        cout<<"YES"<<endl;
31     else cout<<"NO"<<endl;
32     return 0;
33 }

 

posted @ 2015-07-28 21:35  ~瞬间*  阅读(244)  评论(0编辑  收藏  举报