Неправильный результат std::string::length()

В операторе if дважды проверяю длину строки, дважды эта проверка игнорируется. Сделал вывод длин этих строк в cout, у каждой строки показало длину 2. Почему это происходит и как это исправить? Входные данные: 6 2 to be or not to be

#include <iostream>
#include <map>
#include <vector>
#include <string>

int main() {
    size_t m, n;
    std::map<std::string, size_t> map;
    std::vector<std::string> vec;
    std::string word;

    std::cin >> m >> n;
    for (size_t i = 0; i < m; ++i) {
        std::cin >> word;
        vec.push_back(word);
    }
    word.clear();

    for (size_t i = 0; i < m; ++i) {
        for (size_t j = 0; j < vec[i].length(); ++j) {
                for (size_t k = j; k < n + j; ++k) {
                    word += vec[i][k];
                }
                if (word.length() == n) {
                    if (map.find(word) == map.end()) {
                        map[word] = 1;
                    } else {
                        ++map[word];
                    }
                }
                word.clear();
        }
    }

    for (const auto& [k, v] : map) {
        if (k.length() == n) {
            std::cout << v << " - " << k << "\n";
        }
    }
}

Ответы (1 шт):

Автор решения: Harry

Ну, тогда все, что вам нужно, как я понимаю —

int main() {
    size_t m, n;
    std::map<std::string, size_t> map;
    std::string word;

    std::cin >> m >> n;
    for (size_t i = 0; i < m; ++i)
    {
        std::cin >> word;
        if (word.length() >= n)
            for(size_t j = 0; j <= word.length() - n; ++j)
                map[word.substr(j,n)]++;

    }
    for (const auto& [k, v] : map) {
        std::cout << k << "   " << v << "\n";
    }
}

Разве что пересортировать вывод, если надо упорядочить по количеству...

Или даже так (надо пояснять, почему приведение к знаковому int необходимо?):

int main() {
    int m, n;
    std::map<std::string, size_t> map;
    std::string word;

    std::cin >> m >> n;
    for (size_t i = 0; i < m; ++i)
    {
        std::cin >> word;
        for(int j = 0; j <= int(word.length()) - n; ++j)
            map[word.substr(j,n)]++;

    }
    for (const auto& [k, v] : map) {
        std::cout << k << "   " << v << "\n";
    }
}
→ Ссылка