#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
#include <string>
#include <vector>
#include <cassert>
template <typename Container>
std::ostream& print(const std::string& name, const Container& c)
{
std::ostream& os = std::cout;
using value_type = typename Container::value_type;
os << name << ": ";
std::copy(std::begin(c), std::end(c), std::ostream_iterator<value_type>(os, ", "));
os << '\n';
return os;
}
int main() {
std::vector<std::string> a1{{"A", "B", "C"}};
std::vector<std::string> a2{{"B", "C", "D", "F", "X"}};
print("a1", a1);
print("a2", a2);
std::cout << '\n';
assert(std::is_sorted(a1.begin(), a1.end()));
assert(std::is_sorted(a2.begin(), a2.end()));
std::set<std::string> intersection;
std::set<std::string> symmetric_diff;
std::set<std::string> union_;
std::set_union(a1.begin(), a1.end(), a2.begin(), a2.end(),
std::inserter(union_, union_.begin()));
print("union_", union_);
std::set_intersection(a1.begin(), a1.end(), a2.begin(), a2.end(),
std::inserter(intersection, intersection.begin()));
print("intersection", intersection);
std::set_symmetric_difference(a1.begin(), a1.end(), a2.begin(), a2.end(),
std::inserter(symmetric_diff, symmetric_diff.begin()));
print("symmetric_difference", symmetric_diff);
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CgojaW5jbHVkZSA8Y2Fzc2VydD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CnN0ZDo6b3N0cmVhbSYgcHJpbnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IENvbnRhaW5lciYgYykKewoJc3RkOjpvc3RyZWFtJiBvcyA9IHN0ZDo6Y291dDsKCXVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBDb250YWluZXI6OnZhbHVlX3R5cGU7CglvcyA8PCBuYW1lIDw8ICI6ICI7CglzdGQ6OmNvcHkoc3RkOjpiZWdpbihjKSwgc3RkOjplbmQoYyksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjx2YWx1ZV90eXBlPihvcywgIiwgIikpOyAKCW9zIDw8ICdcbic7CglyZXR1cm4gb3M7Cn0KCmludCBtYWluKCkgewoJCglzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYTF7eyJBIiwgIkIiLCAiQyJ9fTsKCXN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhMnt7IkIiLCAiQyIsICJEIiwgIkYiLCAiWCJ9fTsKCXByaW50KCJhMSIsIGExKTsKCXByaW50KCJhMiIsIGEyKTsKCXN0ZDo6Y291dCA8PCAnXG4nOwoJCglhc3NlcnQoc3RkOjppc19zb3J0ZWQoYTEuYmVnaW4oKSwgYTEuZW5kKCkpKTsKCWFzc2VydChzdGQ6OmlzX3NvcnRlZChhMi5iZWdpbigpLCBhMi5lbmQoKSkpOwoKCXN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBpbnRlcnNlY3Rpb247CglzdGQ6OnNldDxzdGQ6OnN0cmluZz4gc3ltbWV0cmljX2RpZmY7CglzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdW5pb25fOwoKICAJc3RkOjpzZXRfdW5pb24oYTEuYmVnaW4oKSwgYTEuZW5kKCksIGEyLmJlZ2luKCksIGEyLmVuZCgpLCAKCQkJCQkJICBzdGQ6Omluc2VydGVyKHVuaW9uXywgdW5pb25fLmJlZ2luKCkpKTsKCXByaW50KCJ1bmlvbl8iLCB1bmlvbl8pOwoKCXN0ZDo6c2V0X2ludGVyc2VjdGlvbihhMS5iZWdpbigpLCBhMS5lbmQoKSwgYTIuYmVnaW4oKSwgYTIuZW5kKCksIAoJCQkJCQkgIHN0ZDo6aW5zZXJ0ZXIoaW50ZXJzZWN0aW9uLCBpbnRlcnNlY3Rpb24uYmVnaW4oKSkpOwoJcHJpbnQoImludGVyc2VjdGlvbiIsIGludGVyc2VjdGlvbik7CgoJc3RkOjpzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UoYTEuYmVnaW4oKSwgYTEuZW5kKCksIGEyLmJlZ2luKCksIGEyLmVuZCgpLCAKCQkJCQkJICBzdGQ6Omluc2VydGVyKHN5bW1ldHJpY19kaWZmLCBzeW1tZXRyaWNfZGlmZi5iZWdpbigpKSk7CglwcmludCgic3ltbWV0cmljX2RpZmZlcmVuY2UiLCBzeW1tZXRyaWNfZGlmZik7Cn0=
a1: A, B, C,
a2: B, C, D, F, X,
union_: A, B, C, D, F, X,
intersection: B, C,
symmetric_difference: A, D, F, X,