poj1635

题目大意:给出两串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,这样深搜一颗树
深搜完之后问这两棵树是不是同一棵树。。

思路:本题为最小树表示法。。类似dp的思想实现。。

     当1和0的个数相等时,这个序列便是一颗子树。。

       每次搜到一个子树,我们便对子树进行大小排序。。

      每层都这样操作。。

      那么最后的序列便是树的最小表示法。。因为其是唯一的。。

      两串如果相等便是同一颗数。。

 1 /*
 2   Time:2013.03.06 00:19:55
 3   State:Accepted
 4 */
 5 #include <iostream>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <vector>
10 #include <algorithm>
11 #include <cmath>
12 #include <cstdlib>
13 #include <cstdio>
14 using namespace std;
15 string str1 , str2;
16 int test;
17 
18 string mintree(string str){
19      int deepth= 0 , st = 0;
20      vector <string> a;
21      string stemp;
22      for (int i = 0; i < str.size(); ++i) {
23           deepth += str[i] == '1'? -1 : 1;
24           if (!deepth){
25               stemp = string("0") + mintree(str.substr(st + 1, i - st)) +string("1");
26               a.push_back(stemp);
27               st = i + 1;
28           }
29      }
30      sort(a.begin(), a.end());
31      stemp = string("");
32      for (int i = 0; i < a.size(); ++i)
33         stemp += a[i];
34      return stemp;
35      
36         
37 }
38 
39 void solve(){
40      cin >> str1 >> str2;
41      string s1 = mintree(str1);
42      string s2 = mintree(str2);
43      if (s1 == s2) printf("same\n");
44      else printf("different\n");
45 }
46 
47 int main(){
48      freopen("poj1635.in","r",stdin);
49      freopen("poj1635.out","w",stdout);
50      scanf("%d",&test);
51      for (int i = 1; i <= test; ++i){
52           solve();
53      }
54      fclose(stdin);
55      fclose(stdout);
56 }

 

  

    

 

posted on 2013-03-23 21:01  yzcstc  阅读(265)  评论(0编辑  收藏  举报