1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <unordered_map>
using namespace std;
void addPointsToMap(int r, int i, int numOfChanged, string s,
                    unordered_map<string, int>* map, int* licznik) {
    if ((*map).find(s) == (*map).end()) {
        (*map)[s] = 1;
        (*licznik) = ((*licznik) + 1) % 1000000007;
    }
    // cout << s << '\n';
    if (numOfChanged == r || i == s.size()) {
        return;
    }
    addPointsToMap(r, i + 1, numOfChanged, s, map, licznik);
    string tmp = s.substr();
    tmp[i] = tmp[i] - '0' ? '0' : '1';
    addPointsToMap(r, i + 1, numOfChanged + 1, tmp, map, licznik);
}
int main() {
    unordered_map<string, int> map;
    int n;
    int r;
    int licznik = 0;
    string tmp;
    cin >> n;
    for (int i = 0; i < 3; i++) {
        cin >> r;
        cin >> tmp;
        addPointsToMap(r, 0, 0, tmp, &map, &licznik);
    }
    cout << licznik << '\n';
    return 0;
}