Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <list>
- #include <algorithm>
- #include <string>
- #include <unordered_set>
- #include <deque>
- using namespace std;
- struct hash_X{
- size_t operator()(const unordered_set<int> &x) const{
- int sum = 0;
- for(int i: x){sum = sum+i;}
- return sum;
- }
- };
- unordered_set<unordered_set<int>, hash_X> mt(list<string> L){
- unordered_set<unordered_set<int>, hash_X> S;
- list<string> K;
- deque<list<string>> Q;
- Q.push_back(L);
- while(Q.size() > 0){
- K = Q.back();
- unordered_set<int> tmp;
- for(string s: K){if( s!="(" and s!=")" ){int i = stoi(s); tmp.insert(i);}}
- S.insert(tmp);
- //K is of the form for example (x(yz)), so first we unwrap ~ x(yz) and split into the two subtrees x and (yz)
- //and add both to the queue. If only one node is left ( x ) we dont add it back to the queue
- if(K.size() >= 2){
- K.pop_front();
- K.pop_back();
- list<string>::iterator it = K.begin();
- if(*it == "("){
- int i = 1;
- while(i != 0){
- it++;
- if(*it == ")"){i = i-1;}
- else if(*it == "("){i=i+1;}
- }
- }
- it++;
- list<string> B;
- list<string>::iterator itB = B.begin();
- B.splice(itB, K, it, K.end());
- Q.push_front(K);
- Q.push_front(B);
- }
- Q.pop_back();
- }
- return S;
- }
- int main(){
- int n;
- string x, y;
- char c;
- list<string> A, B;
- cin >> n;
- cin.ignore();
- cin >> x;
- cin >> y;
- // parse ((3,(1,(5,2))),4) into ((3(1(52)))4)
- for(int i = 0; i < x.size(); i++){
- string c = "";
- c += x[i];
- if( c == "(" or c == ")" ){A.push_back(c);}
- if( isdigit(x[i]) ){
- string tmp = "";
- while( isdigit(x[i]) ){
- tmp += x[i];
- i++;
- }
- i--;
- A.push_back(tmp);
- }
- }
- for(int i = 0; i <= y.size(); i++){
- string c = "";
- c += y[i];
- if( c == "(" or c == ")" ){B.push_back(c);}
- if( isdigit(y[i]) ){
- string tmp = "";
- while( isdigit(y[i]) ){
- tmp += y[i];
- i++;
- }
- i--;
- B.push_back(tmp);
- }
- }
- // make the trees
- unordered_set<unordered_set<int>, hash_X> t1 = mt(A);
- unordered_set<unordered_set<int>, hash_X> t2 = mt(B);
- unordered_set<unordered_set<int>, hash_X> i(t1.begin(), t1.end());
- int res = count_if(t2.begin(), t2.end(), [&](unordered_set<int> k) {return i.find(k) != i.end();});
- cout << res;
- }
Advertisement
Add Comment
Please, Sign In to add comment