В прошлом соревновании меня попросили сгенерировать 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;
}