Список десятизначных строк, где каждая 4-значная подстрока уникальна

В прошлом соревновании меня попросили сгенерировать 10-значные строки, используя цифры от 0 до 9 раз. Любая четырехзначная подстрока, используемая в строке, не может быть использована снова.

Какое максимальное количество уникальных строк вы можете генерировать с использованием этих правил? Перечислите их.

Пример:

Если вы используете строку 0243697518 в своем списке, вы не можете генерировать строки, содержащие 0243, 2436, 4369, 3697, 6975, 9751 и 7518


Чтобы решить эту проблему, я написал программу С++, просто она сканирует всю перестановку "0123456789" и добавляет их в список решений, если ранее не использовались 4-значные подстроки кода. Но проблема моего алгоритма в том, что размер списка решений зависит от начальной точки, которую вы добавляете в список. Если я начну добавлять в список из "0123456789", список заканчивается 504 записями, которые не являются максимальными. Мне действительно интересно, как решить этот вопрос, любая помощь высоко ценится. Я открыт для прослушивания вашего математического решения или любых предложений алгоритма для генерации списка.

#include <iostream>
#include <cstdint>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

void main(void)
{
    set<string> substring_list; // holds the list of used 4 digit sub-strings
    set<string> solution_list;

    string code = "0123456789";
    do 
    {
        vector<string> subs;
        for (int i = 0; i < 7; i++)
        {
            // adds all 4  digits sub-strings used in the code
            subs.push_back(code.substr(i, 4));
        }

        if ((substring_list.find(subs[0]) == substring_list.end()) &&
            (substring_list.find(subs[1]) == substring_list.end()) &&
            (substring_list.find(subs[2]) == substring_list.end()) &&
            (substring_list.find(subs[3]) == substring_list.end()) &&
            (substring_list.find(subs[4]) == substring_list.end()) &&
            (substring_list.find(subs[5]) == substring_list.end()) &&
            (substring_list.find(subs[6]) == substring_list.end()))
        {
            // if all substrings are unique and not used before
            // then add code into solution list
            solution_list.insert(code);

            // add newly added code substrings to substring list.
            for (auto s: subs)
            {
                substring_list.insert(s);
            }

        }
    } while (next_permutation(code.begin(), code.end()));

    cout << solution_list.size() << endl;
}