POJ 1635 树的最小表示法

 题目大意:

用一堆01字符串表示在树上走动的路径,0表示往前走,1表示往回走,问两种路径方式下形成的树是不是相同的树

 

我们可以利用递归的方法用hash字符串表示每一棵子树,然后将所有子树按照字典序排序,来判断这个hash字符串是否相同

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <iostream>

 4 #include <string>

 5 #include <algorithm>

 6 #include <vector>

 7 using namespace std;

 8 #define N 3010

 9 char s1[N] , s2[N];

10 

11 string dfs(int l , int r , char *s)

12 {

13    // cout<<l<<" "<<r<<endl;

14     vector<string> v;

15     int num = 0;

16     string ret = "";

17     for(int i=l ; i<=r ; i++){

18         if(s[i] == '0') num++;

19         else num--;

20         if(num==0){

21             string tmp = "0"+dfs(l+1 , i-1 , s)+"1";

22             v.push_back(tmp);

23             l = i+1;

24         }

25     }

26     sort(v.begin() , v.end());

27     for(int i=0 ; i<v.size() ; i++)

28         ret += v[i];

29     return ret;

30 }

31 

32 int main()

33 {

34     #ifndef ONLINE_JUDGE

35         freopen("a.in" , "r" , stdin);

36     #endif // ONLINE_JUDGE

37     int T;

38     scanf("%d" , &T);

39     while(T--){

40         scanf("%s%s" , s1 , s2);

41         string t1 = dfs(0 , strlen(s1)-1 , s1);

42         string t2 = dfs(0 , strlen(s2)-1 , s2);

43       //  cout<<t1<<" "<<t2<<endl;

44         printf("%s\n" , (t1==t2)?"same":"different");

45     }

46     return 0;

47 }

 

你可能感兴趣的:(poj)