把0看成1 1看成-1
对于一个子树来讲如果从开头到某一段的和为0表示又回到了这个子树的根
根据子树把字符串截乘小段 再sort string 方便比较两个树是否相同
注意截成的小段递归求解时要把开头和结尾的0和1去掉 才算是以这个子树的根为起点(开头本来表示进入这个根,结尾本来表示离开这个根)
好用的stl:
ss=s.substr(a,b) a为起点下标,b为长度
sort(vs,begin(),vs.end())对于vector的sort
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
string s1,s2;
void change(string &s)
{
if(s=="01")return;
s=s.substr(1,s.size()-2);
int st=0,cnt=0;
vector<string>vs;
vs.clear();
for(int i=0;i<s.size();++i)
{
cnt+=(s[i]=='0'?1:-1);
if(!cnt)
{
string ss=s.substr(st,i-st+1);
change(ss);
vs.push_back(ss);
st=i+1;
}
}
sort(vs.begin(),vs.end());
s='0';
for(int j=0;j<vs.size();++j)
{
s+=vs[j];
}
s+='1';
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
cin>>s1;
cin>>s2;
s1='0'+s1+'1';
s2='0'+s2+'1';//方便后面递归
change(s1);
change(s2);
if(s1==s2)printf("same\n");
else printf("different\n");
}
return 0;
}