#include <iostream>
#include <list>
#include <vector>
template <typename InIt1, typename InIt2, typename Compare = std::equal_to<>>
bool is_subsequence(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, Compare cmp = Compare{})
{
if (first2 == last2) {
return false; // sub empty (should this return true?)
}
for (; first1 != last1; ++first1) {
if (cmp(*first1, *first2)) {
if (++first2 == last2) {
return true; // sub exhausted
}
}
}
return false; // seq exhausted
}
template <typename Seq, typename Sub, typename Compare = std::equal_to<>>
bool is_subsequence(const Seq &seq, const Sub &sub, Compare cmp = Compare{})
{
return is_subsequence(std::begin(seq), std::end(seq), std::begin(sub), std::end(sub), cmp);
}
int main()
{
std::vector<int> a = { 1, 2, 3, 4 }, b = { 2, 4 };
std::list<int> c = { 4, 2 };
std::vector<int> d = { 3, 6, 3, 1, 2, 3 };
int e[] = { 3, 1, 3 };
std::cout << is_subsequence(a, b) << '\n';
std::cout << is_subsequence(a, b, [](int lhs, int rhs) { return lhs == rhs; }) << '\n';
std::cout << is_subsequence(a, c) << '\n';
std::cout << is_subsequence(d, e) << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlIDx0eXBlbmFtZSBJbkl0MSwgdHlwZW5hbWUgSW5JdDIsIHR5cGVuYW1lIENvbXBhcmUgPSBzdGQ6OmVxdWFsX3RvPD4+CmJvb2wgaXNfc3Vic2VxdWVuY2UoSW5JdDEgZmlyc3QxLCBJbkl0MSBsYXN0MSwgSW5JdDIgZmlyc3QyLCBJbkl0MiBsYXN0MiwgQ29tcGFyZSBjbXAgPSBDb21wYXJle30pCnsKCWlmIChmaXJzdDIgPT0gbGFzdDIpIHsKCQlyZXR1cm4gZmFsc2U7IC8vIHN1YiBlbXB0eSAoc2hvdWxkIHRoaXMgcmV0dXJuIHRydWU/KQoJfQoJZm9yICg7IGZpcnN0MSAhPSBsYXN0MTsgKytmaXJzdDEpIHsKCQlpZiAoY21wKCpmaXJzdDEsICpmaXJzdDIpKSB7CgkJCWlmICgrK2ZpcnN0MiA9PSBsYXN0MikgewoJCQkJcmV0dXJuIHRydWU7IC8vIHN1YiBleGhhdXN0ZWQKCQkJfQoJCX0KCX0KCXJldHVybiBmYWxzZTsgLy8gc2VxIGV4aGF1c3RlZAp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VxLCB0eXBlbmFtZSBTdWIsIHR5cGVuYW1lIENvbXBhcmUgPSBzdGQ6OmVxdWFsX3RvPD4+CmJvb2wgaXNfc3Vic2VxdWVuY2UoY29uc3QgU2VxICZzZXEsIGNvbnN0IFN1YiAmc3ViLCBDb21wYXJlIGNtcCA9IENvbXBhcmV7fSkKewoJcmV0dXJuIGlzX3N1YnNlcXVlbmNlKHN0ZDo6YmVnaW4oc2VxKSwgc3RkOjplbmQoc2VxKSwgc3RkOjpiZWdpbihzdWIpLCBzdGQ6OmVuZChzdWIpLCBjbXApOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPGludD4gYSA9IHsgMSwgMiwgMywgNCB9LCBiID0geyAyLCA0IH07CiAgICBzdGQ6Omxpc3Q8aW50PiBjID0geyA0LCAyIH07CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IGQgPSB7IDMsIDYsIDMsIDEsIDIsIDMgfTsKICAgIGludCBlW10gPSB7IDMsIDEsIDMgfTsKCiAgICBzdGQ6OmNvdXQgPDwgaXNfc3Vic2VxdWVuY2UoYSwgYikgPDwgJ1xuJzsKICAgIHN0ZDo6Y291dCA8PCBpc19zdWJzZXF1ZW5jZShhLCBiLCBbXShpbnQgbGhzLCBpbnQgcmhzKSB7IHJldHVybiBsaHMgPT0gcmhzOyB9KSA8PCAnXG4nOwogICAgc3RkOjpjb3V0IDw8IGlzX3N1YnNlcXVlbmNlKGEsIGMpIDw8ICdcbic7CiAgICBzdGQ6OmNvdXQgPDwgaXNfc3Vic2VxdWVuY2UoZCwgZSkgPDwgJ1xuJzsKfQo=