传送门:点击打开链接
题意:有根树,0表示远离根节点,1表示接近根节点,一条边只访问一次。现在告诉你两种访问方式,问这两棵树是否同构异形。
思路:从下向上把子树排序,这样向上,最后表示出来的就是最小表示的了,那么就有序了,就可以直接比较字符串就能判断两棵树是否相同。
#include<map> #include<set> #include<cmath> #include<ctime> #include<stack> #include<queue> #include<cstdio> #include<cctype> #include<string> #include<vector> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #define fuck(x) cout<<"["<<x<<"]" #define FIN freopen("input.txt","r",stdin) #define FOUT freopen("output.txt","w+",stdout) using namespace std; typedef long long LL; const int MX = 1e4 + 5; char S[MX]; string solve(int l, int r) { int cnt = 0, p = l; vector<string>tmp; for(int i = l; i <= r; i++) { if(S[i] == '0') cnt++; else cnt--; if(cnt == 0) { tmp.push_back(solve(p + 1, i -1)); p = i + 1; } } sort(tmp.begin(), tmp.end()); string ret = "0"; for(int i = 0; i < (int)tmp.size(); i++) { ret += tmp[i]; } return ret + "1"; } int main() { int T; //FIN; scanf("%d", &T); while(T--) { scanf("%s", S); string a = solve(0, strlen(S) - 1); scanf("%s", S); string b = solve(0, strlen(S) - 1); if(a == b) printf("same\n"); else printf("different\n"); } return 0; }