Проблема Каттиса — Классификация животных

в настоящее время я пытаюсь решить https://open.kattis.com/problems/animal. Мой код можно найти здесь: http://pastebin.com/xgXiDj91. Я новичок в конкурентном программировании и C ++ в целом. Сказав это, мой подход заключается в разборе входной строки [например, (1, (2, (3, (4, (5, (6, (7, (8, (9,10))))))))))] в список [((3 (1 (52) )) 4)]. После этого я отмечаю все элементы, разделяю их на два поддерева и добавляю оба обратно в очередь, начиная снова, пока больше нечего делить. После этого я сравниваю два набора, которые я получил таким образом. Если я не ошибаюсь, это должно привести к сложности O (Nlog (N)), так как для каждого поддерева мне нужно собрать все элементы, которые к нему относятся, что составит Nlog (N) в полном двоичном дереве. Это работает для предоставленных тестовых наборов, но превышает срок подачи.

Не могли бы вы помочь мне выяснить, где я могу улучшить свой код и что я сделал неэффективно?

С уважением,
Миха.

PS: вот мой код:

#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(not Q.empty()){
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;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]