字符串——树形地铁系统(树的最小表示)

传送门:157. 树形地铁系统 - AcWing题库

思路:按照题意,可以有多重不同的01串表示同一颗树,这里不能直接用字符串的最小表示来得到树的最小表示,对于中央车站,它有多个不同的子树,所以应该将子树的最小表示串当做一个字母最后得到一个字典序的串,这里需要递归处理每一个子树,叶节点的最小表示串为空。

以下用一个已经是最小表示的树来演示以下过程

         左树           右树

a=0(00011011+001011)1 (里面已经加了前置0和后置1)

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e4;
char a[N],b[N];
string dfs(string &a,int &u)
{
    vector<string>as;
    u++;
     while(a[u]=='0') as.push_back(dfs(a,u));
     u++;
     sort(as.begin(),as.end());
     string res="0";
     for(auto s:as) res+=s;
     res+='1';
     return res;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        string a,b;
        cin>>a>>b;
        a='0'+a+'1';
        b='0'+b+'1';
        int ua=0,ub=0;
        if(dfs(a,ua)==dfs(b,ub))puts("same");
        else puts("different");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值