不见得是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