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 }
  • 相关阅读:
    【就业】腾讯VS百度
    MySQL基础知识
    PHP读取远程文件并保存
    【GTK3.0】背景设置
    【GTK】信号量(signal)大全
    c# 调用win32 api
    PHP写窗体程序
    一个苏州IT人的5年挨踢经历面试篇(之二)
    【c++ Primer 】 4.10复习题 12题(int)、(int&)和(int*)
    线段树技巧
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4543446.html
Copyright © 2011-2022 走看看