#define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i)
#define MAX 1000005
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
typedef unsigned long long int ulli;
int n;
char A[MAX], B[MAX], C[MAX];
int categ_map[10][10][10];
int main() {
// Prepare categorization map
FOR(a,0,10) FOR(b,0,10) FOR(c,0,10) {
categ_map[a][b][c] = 0;
if ((a+b)%10==c) categ_map[a][b][c] = (a+b<=9 ? 1 : 4);
else if ((a+b+1)%10==c) categ_map[a][b][c] = (a+b+1<=9 ? 2 : 3);
}
// Read input
scanf("%s", A);
scanf("%s", B);
scanf("%s", C);
n = strlen(A);
// Categorize chars
vector<int> cat;
FOR(i,0,n) cat.push_back(categ_map[A[i]-'0'][B[i]-'0'][C[i]-'0']);
cat.push_back(0);
// Prepare chunks table
vector<int> A;
bool in_sequence = false;
FOR(i,0,cat.size()) {
if (in_sequence) {
if (cat[i]==0) { A.push_back(0); in_sequence=false; }
if (cat[i]==1) { A.push_back(0); A.push_back(1); in_sequence=false; }
if (cat[i]==2) A.push_back(0);
if (cat[i]==3);
if (cat[i]==4) { A.push_back(1); in_sequence=false; }
} else {
if (cat[i]==0) A.push_back(0);
if (cat[i]==1) A.push_back(1);
if (cat[i]==2) in_sequence=true;
if (cat[i]==3) A.push_back(0);
if (cat[i]==4) A.push_back(0);
}
}
A.push_back(0);
// Calculate result
ulli result = 0;
int stack = 0;
FOR(i,0,A.size()) {
stack += A[i];
if (A[i] == 0 && stack>0) {
result += (ulli)(stack) * (ulli)(stack+1) / (ulli)(2);
stack = 0;
}
}
// Print result
printf("%lld\n", result);
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 | #define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i) #define MAX 1000005 #include <cstdio> #include <cstring> #include <vector> using namespace std; typedef unsigned long long int ulli; int n; char A[MAX], B[MAX], C[MAX]; int categ_map[10][10][10]; int main() { // Prepare categorization map FOR(a,0,10) FOR(b,0,10) FOR(c,0,10) { categ_map[a][b][c] = 0; if ((a+b)%10==c) categ_map[a][b][c] = (a+b<=9 ? 1 : 4); else if ((a+b+1)%10==c) categ_map[a][b][c] = (a+b+1<=9 ? 2 : 3); } // Read input scanf("%s", A); scanf("%s", B); scanf("%s", C); n = strlen(A); // Categorize chars vector<int> cat; FOR(i,0,n) cat.push_back(categ_map[A[i]-'0'][B[i]-'0'][C[i]-'0']); cat.push_back(0); // Prepare chunks table vector<int> A; bool in_sequence = false; FOR(i,0,cat.size()) { if (in_sequence) { if (cat[i]==0) { A.push_back(0); in_sequence=false; } if (cat[i]==1) { A.push_back(0); A.push_back(1); in_sequence=false; } if (cat[i]==2) A.push_back(0); if (cat[i]==3); if (cat[i]==4) { A.push_back(1); in_sequence=false; } } else { if (cat[i]==0) A.push_back(0); if (cat[i]==1) A.push_back(1); if (cat[i]==2) in_sequence=true; if (cat[i]==3) A.push_back(0); if (cat[i]==4) A.push_back(0); } } A.push_back(0); // Calculate result ulli result = 0; int stack = 0; FOR(i,0,A.size()) { stack += A[i]; if (A[i] == 0 && stack>0) { result += (ulli)(stack) * (ulli)(stack+1) / (ulli)(2); stack = 0; } } // Print result printf("%lld\n", result); return 0; } |
English