#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;
}
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; } |
English