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 }