Я построил решение этой проблемы на C ++, используя Tr ie. Сложность составляет O (n²), но она дешевле в пространстве.
Идея состоит в том, чтобы построить Tr ie со всеми возможностями, а затем выполнить BFS в Tr ie, не обращая внимания на превышают лимит нечетных чисел.
#include <bits/stdc++.h>
using namespace std;
#define odd(n) (n % 2 != 0)
struct trie {
unordered_map<int, trie*> root;
trie(){ root.clear(); }
bool contains(int key){ return root.find(key) != root.end();}
void add(int *arr, int index, int n){
trie *t = this;
for(int i = index; i < n; i++){
if(t->contains(arr[i])){
t = t->root[arr[i]];
}
else{
t->root[arr[i]] = new trie();
t = t->root[arr[i]];
}
}
}
int BFS(int m){
queue<pair<trie*, int>> q;
q.push(make_pair(this, 0));
int ans = 0;
while(q.size()){
pair<trie*, int> p = q.front();
q.pop();
for (auto& it: p.first->root) {
if(p.second + odd(it.first) <= m) ans++;
else continue;
q.push(make_pair(it.second, p.second + odd(it.first)));
}
}
return ans;
}
};
trie* t;
int main(){
t = new trie();
int arr[] = {2,1,2,1,3};
int n = 5;
int m = 2;
for(int i = 0; i < n; i++){
t->add(arr, i, n);
}
cout<<t->BFS(m)<<endl;
return 0;
}
ВЫХОД: 10
.