zoukankan      html  css  js  c++  java
  • 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
    " , (t1==t2)?"same":"different");
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    P2676 超级书架
    P2955 [USACO09OCT]奇数偶数Even? Odd?
    P1554 梦中的统计
    P2614 计算器弹琴
    4246 奶牛的身高
    Render2
    @viewChild
    querySelector
    ionic4封装样式原理
    事件委托和事件冒泡
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4543446.html
Copyright © 2011-2022 走看看