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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string kluski, pierogi, bigos;
    cin >> kluski >> pierogi >> bigos;

    int dlugosc_farszu = (int)kluski.size();

    array<array<int, 2>, 9> czary_mary;
    auto zakoduj = [&](int lewy_but, int prawy_but) {
        return (lewy_but + 1) * 3 + (prawy_but + 1);
    };

    for (int lewy_but = -1; lewy_but <= 1; lewy_but++) {
        for (int prawy_but = -1; prawy_but <= 1; prawy_but++) {
            int numer_funkcji = zakoduj(lewy_but, prawy_but);
            czary_mary[numer_funkcji][0] = lewy_but;
            czary_mary[numer_funkcji][1] = prawy_but;
        }
    }

    array<array<int, 9>, 9> zderzak;
    for (int stary_kompot = 0; stary_kompot < 9; stary_kompot++) {
        for (int nowy_ogorek = 0; nowy_ogorek < 9; nowy_ogorek++) {
            int wynik_dla_zera;
            int wynik_dla_jedynki;

            for (int wejscie = 0; wejscie <= 1; wejscie++) {
                int srodek = czary_mary[nowy_ogorek][wejscie];
                int koniec = -1;
                if (srodek != -1) koniec = czary_mary[stary_kompot][srodek];
                if (wejscie == 0) wynik_dla_zera = koniec;
                else wynik_dla_jedynki = koniec;
            }

            zderzak[stary_kompot][nowy_ogorek] = zakoduj(wynik_dla_zera, wynik_dla_jedynki);
        }
    }

    auto zrob_kolumne = [&](char a, char b, char c) {
        int suma_parowek = (a - '0') + (b - '0');
        int wynik_dla_zera = -1;
        int wynik_dla_jedynki = -1;

        if (suma_parowek == c - '0') wynik_dla_zera = 0;
        else if (suma_parowek == c - '0' + 10) wynik_dla_zera = 1;

        if (suma_parowek + 1 == c - '0') wynik_dla_jedynki = 0;
        else if (suma_parowek + 1 == c - '0' + 10) wynik_dla_jedynki = 1;

        return zakoduj(wynik_dla_zera, wynik_dla_jedynki);
    };

    array<long long, 9> stare_kluski{}, nowe_kluski{};
    long long odpowiedz_wielkiego_gloda = 0;

    for (int indeks_bigosu = 0; indeks_bigosu < dlugosc_farszu; indeks_bigosu++) {
        int swieza_kolumna = zrob_kolumne(kluski[indeks_bigosu], pierogi[indeks_bigosu], bigos[indeks_bigosu]);

        nowe_kluski.fill(0);
        nowe_kluski[swieza_kolumna]++;

        for (int stan_starego_kotleta = 0; stan_starego_kotleta < 9; stan_starego_kotleta++) {
            if (stare_kluski[stan_starego_kotleta] == 0) continue;
            int po_doklejeniu_ogorka = zderzak[stan_starego_kotleta][swieza_kolumna];
            nowe_kluski[po_doklejeniu_ogorka] += stare_kluski[stan_starego_kotleta];
        }

        for (int stan_nowego_kotlecika = 0; stan_nowego_kotlecika < 9; stan_nowego_kotlecika++) {
            if (czary_mary[stan_nowego_kotlecika][0] == 0) {
                odpowiedz_wielkiego_gloda += nowe_kluski[stan_nowego_kotlecika];
            }
        }

        stare_kluski = nowe_kluski;
    }

    cout << odpowiedz_wielkiego_gloda << '\n';
    return 0;
}