#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string A, B, C;
cin >> A >> B >> C;
int dlg = A.length();
long long iloscPar = 0;
long long iloscZer = 0;
bool poprawnyLan = false;
int prawoSprawdzanie = -1;
for (int k = 0; k < dlg; ++k) {
int wyzn = (A[k] - '0') + (B[k] - '0') - (C[k] - '0');
int wyjscie_lewo = -1;
int wejscie_prawo = -1;
if (wyzn == 0) { wyjscie_lewo = 0; wejscie_prawo = 0; }
else if (wyzn == -1) { wyjscie_lewo = 0; wejscie_prawo = 1; }
else if (wyzn == 10) { wyjscie_lewo = 1; wejscie_prawo = 0; }
else if (wyzn == 9) { wyjscie_lewo = 1; wejscie_prawo = 1; }
if (wyjscie_lewo == -1) {
//przerywa łańcuch
if (poprawnyLan) {
iloscPar += (iloscZer * (iloscZer - 1)) / 2;
poprawnyLan = false;
}
continue;
}
if (poprawnyLan) {
if (prawoSprawdzanie == wyjscie_lewo) {
// poprawnie
if (wejscie_prawo == 0) iloscZer++;
}
else {
// Łańcuch przerwany
iloscPar += (iloscZer * (iloscZer - 1)) / 2;
// nowy łańcuch
iloscZer = (wyjscie_lewo == 0 ? 1 : 0) + (wejscie_prawo == 0 ? 1 : 0);
}
}
else {
// Zaczynamy nowy łańcuch
poprawnyLan = true;
iloscZer = (wyjscie_lewo == 0 ? 1 : 0) + (wejscie_prawo == 0 ? 1 : 0);
}
prawoSprawdzanie = wejscie_prawo;
}
// Dodanie wyniku z ostatniego łańcucha (jeśli string zakończył się w jego trakcie)
if (poprawnyLan) {
iloscPar += (iloscZer * (iloscZer - 1)) / 2;
}
cout << iloscPar;
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 | #include <iostream> #include <string> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); string A, B, C; cin >> A >> B >> C; int dlg = A.length(); long long iloscPar = 0; long long iloscZer = 0; bool poprawnyLan = false; int prawoSprawdzanie = -1; for (int k = 0; k < dlg; ++k) { int wyzn = (A[k] - '0') + (B[k] - '0') - (C[k] - '0'); int wyjscie_lewo = -1; int wejscie_prawo = -1; if (wyzn == 0) { wyjscie_lewo = 0; wejscie_prawo = 0; } else if (wyzn == -1) { wyjscie_lewo = 0; wejscie_prawo = 1; } else if (wyzn == 10) { wyjscie_lewo = 1; wejscie_prawo = 0; } else if (wyzn == 9) { wyjscie_lewo = 1; wejscie_prawo = 1; } if (wyjscie_lewo == -1) { //przerywa łańcuch if (poprawnyLan) { iloscPar += (iloscZer * (iloscZer - 1)) / 2; poprawnyLan = false; } continue; } if (poprawnyLan) { if (prawoSprawdzanie == wyjscie_lewo) { // poprawnie if (wejscie_prawo == 0) iloscZer++; } else { // Łańcuch przerwany iloscPar += (iloscZer * (iloscZer - 1)) / 2; // nowy łańcuch iloscZer = (wyjscie_lewo == 0 ? 1 : 0) + (wejscie_prawo == 0 ? 1 : 0); } } else { // Zaczynamy nowy łańcuch poprawnyLan = true; iloscZer = (wyjscie_lewo == 0 ? 1 : 0) + (wejscie_prawo == 0 ? 1 : 0); } prawoSprawdzanie = wejscie_prawo; } // Dodanie wyniku z ostatniego łańcucha (jeśli string zakończył się w jego trakcie) if (poprawnyLan) { iloscPar += (iloscZer * (iloscZer - 1)) / 2; } cout << iloscPar; return 0; } |
English