#include <string>
#include <iostream>
#include <vector>
#include <array>
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&sliteral)[N]) {
std::array<e, N-1> buffer; //get buffer
in >> buffer[0]; //skips whitespace
if (N>2)
in.read(&buffer[1], N-2); //read the rest
if (strncmp(&buffer[0], sliteral, N-1)) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
template<class e, class t>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& cliteral) {
e buffer; //get buffer
in >> buffer; //read data
if (buffer != cliteral) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) {
return std::operator>>(in, carray);
}
template<class e, class t, class a>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, a& obj) {
return in >> obj; //read data
}
struct first {
std::string name;
double something;
};
struct mega {
std::vector<first> list;
};
std::istream& operator>>(std::istream& file, first& obj) {
std::string symbol;
char equals;
while(file >> symbol) {
if (symbol[0] == '#') {
std::getline(file, symbol);
} else if (symbol == "<FIRST_END>") {
break;
} else if (symbol == "NAME") {
if (! (file>>'='>>obj.name) )
std::cerr << symbol << " incorrectly formatted";
} else if (symbol == "SOMETHING") {
if (! (file>>'='>>obj.something) )
std::cerr << symbol << " incorrectly formatted";
} else { //not a member: failure
std::cerr << symbol << " is not a member of first";
file.setstate(file.rdstate() | std::ios::badbit);
break;
}
}
return file;
}
std::istream& operator>>(std::istream& file, mega& obj) {
std::string symbol;
first t;
while(file >> symbol) {
if (symbol[0] == '#') {
std::getline(file, symbol);
} else if (symbol == "<FIRST_BEGIN>") {
if (file >> t)
obj.list.push_back(t);
} else {
std::cerr << symbol << " is not a member of mega";
file.setstate(file.rdstate() | std::ios::badbit);
}
}
return file;
}
int main() {
mega obj;
std::cin >> obj;
std::cout << obj.list.size(); //1 if success
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXJyYXk+CgoKdGVtcGxhdGU8Y2xhc3MgZSwgY2xhc3MgdCwgaW50IE4+CnN0ZDo6YmFzaWNfaXN0cmVhbTxlLHQ+JiBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxlLHQ+JiBpbiwgY29uc3QgZSgmc2xpdGVyYWwpW05dKSB7CiAgICAgICAgc3RkOjphcnJheTxlLCBOLTE+IGJ1ZmZlcjsgLy9nZXQgYnVmZmVyCiAgICAgICAgaW4gPj4gYnVmZmVyWzBdOyAvL3NraXBzIHdoaXRlc3BhY2UKICAgICAgICBpZiAoTj4yKQogICAgICAgICAgICAgICAgaW4ucmVhZCgmYnVmZmVyWzFdLCBOLTIpOyAvL3JlYWQgdGhlIHJlc3QKICAgICAgICBpZiAoc3RybmNtcCgmYnVmZmVyWzBdLCBzbGl0ZXJhbCwgTi0xKSkgLy9pZiBpdCBmYWlsZWQKICAgICAgICAgICAgICAgIGluLnNldHN0YXRlKGluLnJkc3RhdGUoKSB8IHN0ZDo6aW9zOjpiYWRiaXQpOyAvL3NldCB0aGUgc3RhdGUKICAgICAgICByZXR1cm4gaW47Cn0KdGVtcGxhdGU8Y2xhc3MgZSwgY2xhc3MgdD4Kc3RkOjpiYXNpY19pc3RyZWFtPGUsdD4mIG9wZXJhdG9yPj4oc3RkOjpiYXNpY19pc3RyZWFtPGUsdD4mIGluLCBjb25zdCBlJiBjbGl0ZXJhbCkgewogICAgICAgIGUgYnVmZmVyOyAgLy9nZXQgYnVmZmVyCiAgICAgICAgaW4gPj4gYnVmZmVyOyAvL3JlYWQgZGF0YQogICAgICAgIGlmIChidWZmZXIgIT0gY2xpdGVyYWwpIC8vaWYgaXQgZmFpbGVkCiAgICAgICAgICAgICAgICBpbi5zZXRzdGF0ZShpbi5yZHN0YXRlKCkgfCBzdGQ6Omlvczo6YmFkYml0KTsgLy9zZXQgdGhlIHN0YXRlCiAgICAgICAgcmV0dXJuIGluOwp9CnRlbXBsYXRlPGNsYXNzIGUsIGNsYXNzIHQsIGludCBOPgpzdGQ6OmJhc2ljX2lzdHJlYW08ZSx0PiYgb3BlcmF0b3I+PihzdGQ6OmJhc2ljX2lzdHJlYW08ZSx0PiYgaW4sIGUoJmNhcnJheSlbTl0pIHsKICAgICAgICByZXR1cm4gc3RkOjpvcGVyYXRvcj4+KGluLCBjYXJyYXkpOwp9CnRlbXBsYXRlPGNsYXNzIGUsIGNsYXNzIHQsIGNsYXNzIGE+CnN0ZDo6YmFzaWNfaXN0cmVhbTxlLHQ+JiBvcGVyYXRvcj4+KHN0ZDo6YmFzaWNfaXN0cmVhbTxlLHQ+JiBpbiwgYSYgb2JqKSB7CiAgICAgICAgcmV0dXJuIGluID4+IG9iajsgLy9yZWFkIGRhdGEKfQoKCgpzdHJ1Y3QgZmlyc3QgewogICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgIGRvdWJsZSBzb21ldGhpbmc7Cn07CnN0cnVjdCBtZWdhIHsKICAgIHN0ZDo6dmVjdG9yPGZpcnN0PiBsaXN0Owp9OwoKc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgZmlsZSwgZmlyc3QmIG9iaikgewogICAgc3RkOjpzdHJpbmcgc3ltYm9sOwogICAgY2hhciBlcXVhbHM7CiAgICB3aGlsZShmaWxlID4+IHN5bWJvbCkgewogICAgICAgIGlmIChzeW1ib2xbMF0gPT0gJyMnKSB7CiAgICAgICAgICAgIHN0ZDo6Z2V0bGluZShmaWxlLCBzeW1ib2wpOwogICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sID09ICI8RklSU1RfRU5EPiIpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gIk5BTUUiKSB7CiAgICAgICAgICAgIGlmICghIChmaWxlPj4nPSc+Pm9iai5uYW1lKSApCiAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgc3ltYm9sIDw8ICIgaW5jb3JyZWN0bHkgZm9ybWF0dGVkIjsKICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSAiU09NRVRISU5HIikgewogICAgICAgICAgICBpZiAoISAoZmlsZT4+Jz0nPj5vYmouc29tZXRoaW5nKSApCiAgICAgICAgICAgICAgICBzdGQ6OmNlcnIgPDwgc3ltYm9sIDw8ICIgaW5jb3JyZWN0bHkgZm9ybWF0dGVkIjsKICAgICAgICB9IGVsc2UgeyAvL25vdCBhIG1lbWJlcjogZmFpbHVyZQogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgc3ltYm9sIDw8ICIgaXMgbm90IGEgbWVtYmVyIG9mIGZpcnN0IjsKICAgICAgICAgICAgZmlsZS5zZXRzdGF0ZShmaWxlLnJkc3RhdGUoKSB8IHN0ZDo6aW9zOjpiYWRiaXQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmlsZTsKfQoKc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KHN0ZDo6aXN0cmVhbSYgZmlsZSwgbWVnYSYgb2JqKSB7CiAgICBzdGQ6OnN0cmluZyBzeW1ib2w7CiAgICBmaXJzdCB0OwogICAgd2hpbGUoZmlsZSA+PiBzeW1ib2wpIHsKICAgICAgICBpZiAoc3ltYm9sWzBdID09ICcjJykgewogICAgICAgICAgICBzdGQ6OmdldGxpbmUoZmlsZSwgc3ltYm9sKTsKICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSAiPEZJUlNUX0JFR0lOPiIpIHsKICAgICAgICAgICAgaWYgKGZpbGUgPj4gdCkKICAgICAgICAgICAgICAgIG9iai5saXN0LnB1c2hfYmFjayh0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGQ6OmNlcnIgPDwgc3ltYm9sIDw8ICIgaXMgbm90IGEgbWVtYmVyIG9mIG1lZ2EiOwogICAgICAgICAgICBmaWxlLnNldHN0YXRlKGZpbGUucmRzdGF0ZSgpIHwgc3RkOjppb3M6OmJhZGJpdCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZpbGU7Cn0KCmludCBtYWluKCkgewogICAgbWVnYSBvYmo7CiAgICBzdGQ6OmNpbiA+PiBvYmo7CiAgICBzdGQ6OmNvdXQgPDwgb2JqLmxpc3Quc2l6ZSgpOyAvLzEgaWYgc3VjY2Vzcwp9