#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <vector>
#include <algorithm>

std::vector<std::string> extractTokens(std::istream& is)
{
    std::vector<std::string> tokens;
    std::string token;

    while (is >> token)
        tokens.push_back(token);

    return tokens;
}

int main()
{
    std::istringstream is
    {
        "Brianna\n"
        "Lindsey\n"
        "Paul\n"
        "Lisa\n"
    };

    auto names = extractTokens(is);
    std::sort(names.begin(), names.end());


    std::vector<std::string> patterns = { "Li", "Br", "Lin", "P", "Zi", "Au", "i" };

    for (auto& pattern : patterns)
    {
        auto it = std::lower_bound(names.begin(), names.end(), pattern);

        std::cout << "Results for \"" << pattern << "\" are:\n";

        if (it != names.end() && it->find(pattern) == 0)
        {
            while (it != names.end() && it->find(pattern) == 0)
                std::cout << '\t' << *it++ << '\n';
        }
        else
            std::cout << "\tNo results.\n";
        std::cout << '\n';
    }
}