1. 程式人生 > >poj 1635 Subway tree systems(樹的最小表示)

poj 1635 Subway tree systems(樹的最小表示)

需要 tps ola ack get poj systems 是不是 push

Subway tree systems

POJ - 1635

題目大意:給出兩串含有‘1’和‘0’的字符串,0表示向下搜索,1表示回溯,這樣深搜一顆樹,深搜完之後問這兩棵樹是不是同一棵樹

/*
    在poj上交需要加一個string頭文件,不然會CE 
    樹的最小表示
    這裏用的最小表示法就是將樹的所有子樹分別用1個字符串表示,要按字典序排序將他們依依連接起來。連接後如果兩個字符串是一模一樣的,那麽他們必然是同構的。這樣原問題就變成了子問題,子樹又是一顆新的樹。 
*/
#include<iostream>
#include
<cstdio> #include<cstring> #include<vector> #include<string> #include<algorithm> using namespace std; string s1,s2; string mn(string str){//得到樹的最小表示 int dep=0,st=0; vector<string>a; string stemp; for(int i=0;i<str.size();i++){ dep
+=str[i]==1?-1:1; if(!dep){ stemp="0"+mn(str.substr(st+1,i-st))+"1"; a.push_back(stemp); st=i+1; } } sort(a.begin(),a.end()); stemp=string(""); for(int i=0;i<a.size();i++)stemp+=a[i]; return stemp; } int main(){ freopen(
"Cola.txt","r",stdin); int T;scanf("%d",&T); while(T--){ cin>>s1>>s2; string ss1=mn(s1); string ss2=mn(s2); if(ss1==ss2)puts("same"); else puts("different"); } }

poj 1635 Subway tree systems(樹的最小表示)