#include <algorithm>
#include <iostream>
#include <string_view>
#include <unordered_map>
std::size_t longest_unique(std::string_view text) {
    std::unordered_map<char, std::size_t> last;
    std::size_t left = 0, best = 0;
    for (std::size_t right = 0; right < text.size(); ++right) {
        if (const auto it = last.find(text[right]); it != last.end())
            left = std::max(left, it->second + 1);
        last[text[right]] = right;
        best = std::max(best, right - left + 1);
    }
    return best;
}
int main() {
    if (longest_unique("abba") != 2 || longest_unique("") != 0 ||
        longest_unique("aaaa") != 1 || longest_unique("abc") != 3) return 1;
    std::cout << "abba=" << longest_unique("abba") << " empty=" << longest_unique("") << '\n';
}
