#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <list>
#include <regex>
#include <sstream>
#include <string>
using namespace std;
typedef char Task;
struct Tache {
char step;
int duration;
list<Task> precedentTask;
};
istream& operator>>(istream& lhs, Tache& rhs) {
string line;
getline(lhs, line, '\n');
stringstream ss(line);
ss >> rhs.step;
ss.ignore(numeric_limits<streamsize>::max(), '(');
ss >> rhs.duration;
ss.ignore(numeric_limits<streamsize>::max(), ')');
const regex re("\\s*,\\s*([a-zA-Z])");
string precedentTasks;
getline(ss, precedentTasks);
rhs.precedentTask.clear();
transform(sregex_token_iterator(cbegin(precedentTasks), cend(precedentTasks), re, 1), sregex_token_iterator(), back_insert_iterator<list<Task>>(rhs.precedentTask), [](const string& i) {
return i.front();
});
return lhs;
}
int main() {
stringstream seq("A(3)\nB(4),A\nC(2),A\nE(5),A\nG(3),A\nJ(8),B,H\nH(7),C,E,G\nI(6),G\nF(5),H");
list<Tache> allTaches{ istream_iterator<Tache>(seq), istream_iterator<Tache>() };
for (const auto& i : allTaches) {
cout << i.step << ' ' << i.duration << ' ';
copy(cbegin(i.precedentTask), cend(i.precedentTask), ostream_iterator<Task>(cout, " "));
cout << endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHJlZ2V4PgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgY2hhciBUYXNrOwoKc3RydWN0IFRhY2hlIHsKCWNoYXIgc3RlcDsKCWludCBkdXJhdGlvbjsKCWxpc3Q8VGFzaz4gcHJlY2VkZW50VGFzazsKfTsKCmlzdHJlYW0mIG9wZXJhdG9yPj4oaXN0cmVhbSYgbGhzLCBUYWNoZSYgcmhzKSB7CglzdHJpbmcgbGluZTsKCglnZXRsaW5lKGxocywgbGluZSwgJ1xuJyk7CgoJc3RyaW5nc3RyZWFtIHNzKGxpbmUpOwoKCXNzID4+IHJocy5zdGVwOwoJc3MuaWdub3JlKG51bWVyaWNfbGltaXRzPHN0cmVhbXNpemU+OjptYXgoKSwgJygnKTsKCXNzID4+IHJocy5kdXJhdGlvbjsKCXNzLmlnbm9yZShudW1lcmljX2xpbWl0czxzdHJlYW1zaXplPjo6bWF4KCksICcpJyk7CgoJY29uc3QgcmVnZXggcmUoIlxccyosXFxzKihbYS16QS1aXSkiKTsKCXN0cmluZyBwcmVjZWRlbnRUYXNrczsKCglnZXRsaW5lKHNzLCBwcmVjZWRlbnRUYXNrcyk7CgkKCXJocy5wcmVjZWRlbnRUYXNrLmNsZWFyKCk7CgoJdHJhbnNmb3JtKHNyZWdleF90b2tlbl9pdGVyYXRvcihjYmVnaW4ocHJlY2VkZW50VGFza3MpLCBjZW5kKHByZWNlZGVudFRhc2tzKSwgcmUsIDEpLCBzcmVnZXhfdG9rZW5faXRlcmF0b3IoKSwgYmFja19pbnNlcnRfaXRlcmF0b3I8bGlzdDxUYXNrPj4ocmhzLnByZWNlZGVudFRhc2spLCBbXShjb25zdCBzdHJpbmcmIGkpIHsKCQlyZXR1cm4gaS5mcm9udCgpOwoJfSk7CgoJcmV0dXJuIGxoczsKfQoKaW50IG1haW4oKSB7CglzdHJpbmdzdHJlYW0gc2VxKCJBKDMpXG5CKDQpLEFcbkMoMiksQVxuRSg1KSxBXG5HKDMpLEFcbkooOCksQixIXG5IKDcpLEMsRSxHXG5JKDYpLEdcbkYoNSksSCIpOwoKCWxpc3Q8VGFjaGU+IGFsbFRhY2hlc3sgaXN0cmVhbV9pdGVyYXRvcjxUYWNoZT4oc2VxKSwgaXN0cmVhbV9pdGVyYXRvcjxUYWNoZT4oKSB9OwoKCWZvciAoY29uc3QgYXV0byYgaSA6IGFsbFRhY2hlcykgewoJCWNvdXQgPDwgaS5zdGVwIDw8ICcgJyA8PCBpLmR1cmF0aW9uIDw8ICcgJzsKCQljb3B5KGNiZWdpbihpLnByZWNlZGVudFRhc2spLCBjZW5kKGkucHJlY2VkZW50VGFzayksIG9zdHJlYW1faXRlcmF0b3I8VGFzaz4oY291dCwgIiAiKSk7CgkJY291dCA8PCBlbmRsOwoJfQp9