poj之旅——1635

不见得是dp。

题目简述:就是给你一个字符串,0表示向下走一层,1表示往回走一层,走到一个地方就添加一个结点,现在问你这两个字符串构成的树是不是一样的。


如样例:

A:0010011101001011

B:0100011011001011

画出对应的树:

A:

B:

可以看出两者本质是相同的


分析:

我们将根节点的子树排布的顺序进行按照从小到大排,然后对应得到的整个树就是所谓的树的最小表示法,这样就好判断两个树的本质是不是相同的了。

具体的就是0向下走,1向上走,如果有走到根节点,那么就有一个新的子树了,对于每一个子树同样的处理,最后把所有的子树的最小表示排序,连接后即为整个树的最小表示。


参考程序:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string format(string s){
	vector<string> t;
	int last=0,dep=0;
	for (int i=0;i<s.length();i++){
		if (s[i]=='0')dep++;
			else dep--;
		if (!dep){
			if (i>last+2){
				t.push_back("0"+format(s.substr(last+1,i-1-last))+"1");
			}else t.push_back("01");
			last=i+1;
		}
	}
	sort(t.begin(),t.end());
	string res="";
	for (int i=0;i<t.size();i++)
		res+=t[i];
	return res;
}
int main(){
	int T;string s1,s2;
	scanf("%d",&T);
	while (T--){
		cin>>s1>>s2;
		if (format(s1)==format(s2))printf("same\n");
		else printf("different\n");
	}
	return 0;
}



0010011101001011
0100011011001011
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值