// data[] - входные данные, n - их количество.
vector<int> a;
a.reserve(n-1);
for (i = 1; i < n; ++i) a.push_back(data[i] - data[i-1]);
// считаем префикс функцию для строки a.
vector<int> p(n-1);
k = 0;
for (i = 1; i < n-1 ;++i) {
while (k > 0 && a[k] != a[i]) k = p[k-1];
if (a[k] == a[i]) ++k;
p[i] = k;
}
int period = n-1;
if (p[n-2] >= (n-1)/2) period = n - 1 - p[n-2];
// ваш паттерн - a[0..period-1]
Юзай формулу
vector<string> Generate(string s) {
if(s.length() == 1) return {s};
vector<string> ans;
last = s.back();
s = s.substring(0,s.length()-1);
vector<string> prev = Generate(s);
for (const string &entry : prev) {
ans.push_back(entry + last);
ans.push_back(entry + "." + last);
}
return ans;
}
Можно этот же подход использовать и более функционально сделать, если вам надо.