#include <iostream>
#include <map>
#include <string>
using Map = std::map<std::string, int>; // we don't care about the value here
Map const m = { { "/a/b/c", 0 },
{ "/a/b/d", 0 },
{ "/a/b/c/d", 0 },
{ "/e/f/g", 0 },
{ "/a/x/v", 0 },
{ "/e", 0 },
{ "/a/b/c/d/e", 0 } };
int main() {
// Note: string comparison orders the string lexicographically
// with shorter strings coming first
auto current = m.begin();
for (auto it = next(current), end = m.end(); it != end; ++it ) {
// Note: if current is not a prefix of "it", then it cannot be a prefix
// of any key that comes after "it", however of course "it" could
// be such a prefix.
// current is not a prefix of "it" if "it" is shorter
if (it->first.size() <= current->first.size()) { current = it; continue; }
// current is not a prefix of "it"
if (it->first.substr(0, current->first.size()) != current->first) { current = it; continue; }
// current is a prefix
std::cout << "'" << current->first << "' is a prefix of '" << it->first << "'\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIE1hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+OyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBoZXJlCgpNYXAgY29uc3QgbSA9IHsgeyAiL2EvYi9jIiwgMCB9LAogICAgICAgICAgICAgICAgeyAiL2EvYi9kIiwgMCB9LAogICAgICAgICAgICAgICAgeyAiL2EvYi9jL2QiLCAwIH0sCiAgICAgICAgICAgICAgICB7ICIvZS9mL2ciLCAwIH0sCiAgICAgICAgICAgICAgICB7ICIvYS94L3YiLCAwIH0sCiAgICAgICAgICAgICAgICB7ICIvZSIsIDAgfSwKICAgICAgICAgICAgICAgIHsgIi9hL2IvYy9kL2UiLCAwIH0gfTsKCmludCBtYWluKCkgewoJLy8gTm90ZTogc3RyaW5nIGNvbXBhcmlzb24gb3JkZXJzIHRoZSBzdHJpbmcgbGV4aWNvZ3JhcGhpY2FsbHkKCS8vICAgICAgIHdpdGggc2hvcnRlciBzdHJpbmdzIGNvbWluZyBmaXJzdAoJYXV0byBjdXJyZW50ID0gbS5iZWdpbigpOwoJZm9yIChhdXRvIGl0ID0gbmV4dChjdXJyZW50KSwgZW5kID0gbS5lbmQoKTsgaXQgIT0gZW5kOyArK2l0ICkgewoJCS8vIE5vdGU6IGlmIGN1cnJlbnQgaXMgbm90IGEgcHJlZml4IG9mICJpdCIsIHRoZW4gaXQgY2Fubm90IGJlIGEgcHJlZml4CgkJLy8gICAgICAgb2YgYW55IGtleSB0aGF0IGNvbWVzIGFmdGVyICJpdCIsIGhvd2V2ZXIgb2YgY291cnNlICJpdCIgY291bGQKCQkvLyAgICAgICBiZSBzdWNoIGEgcHJlZml4LgoJCQoJCS8vIGN1cnJlbnQgaXMgbm90IGEgcHJlZml4IG9mICJpdCIgaWYgIml0IiBpcyBzaG9ydGVyCgkJaWYgKGl0LT5maXJzdC5zaXplKCkgPD0gY3VycmVudC0+Zmlyc3Quc2l6ZSgpKSB7IGN1cnJlbnQgPSBpdDsgY29udGludWU7IH0KCQkKCQkvLyBjdXJyZW50IGlzIG5vdCBhIHByZWZpeCBvZiAiaXQiCgkJaWYgKGl0LT5maXJzdC5zdWJzdHIoMCwgY3VycmVudC0+Zmlyc3Quc2l6ZSgpKSAhPSBjdXJyZW50LT5maXJzdCkgeyBjdXJyZW50ID0gaXQ7IGNvbnRpbnVlOyB9CgkJCgkJLy8gY3VycmVudCBpcyBhIHByZWZpeAoJCXN0ZDo6Y291dCA8PCAiJyIgPDwgY3VycmVudC0+Zmlyc3QgPDwgIicgaXMgYSBwcmVmaXggb2YgJyIgPDwgaXQtPmZpcnN0IDw8ICInXG4iOwoJfQoJcmV0dXJuIDA7Cn0=