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
#include<cstdio>
#include<vector>

using namespace std;

int main() {
    vector<int> firstNumber;

    char c;
    do {
	scanf("%c", &c);
	if (c != '\n') {
	    firstNumber.push_back(c - '0');
	}
    } while (c != '\n');

    vector<int> secondNumber(firstNumber.size());
    for (int i = 0; i < firstNumber.size(); i++) {
	char digit;
	scanf("%c", &digit);
	secondNumber[i] = digit - '0';
    }
    scanf("\n");

    vector<int> thirdNumber(firstNumber.size());
    for (int i = 0; i < thirdNumber.size(); i++) {
	char digit;
	scanf("%c", &digit);
	thirdNumber[i] = digit - '0';
    }

    long long found = 0;
    int currGroups = 0;
    int groupState = -1;
    for (int i = 0; i < firstNumber.size(); i++) {
	if (firstNumber[i] + secondNumber[i] == thirdNumber[i]) {
	    if (groupState == -1) {
		currGroups += 1;
	    } else {
		groupState = -1;
		currGroups = 1;
	    }
	    found += currGroups;
	} else if (firstNumber[i] + secondNumber[i] + 1 == thirdNumber[i]) {
	    if (groupState == 0) {
		currGroups = 0;
	    }
	    groupState = 0;
	} else if (firstNumber[i] + secondNumber[i] - 9 == thirdNumber[i]) {
	    if (groupState == -1) {
		currGroups = 0;
	    }
	} else if (firstNumber[i] + secondNumber[i] - 10 == thirdNumber[i]) {
	    if (groupState == 0) {
		currGroups += 1;
		found += currGroups;
	    } else {
		currGroups = 0;
	    }
	    groupState = -1;
	} else {
	    groupState = -1;
	    currGroups = 0;
	}
    }

    printf("%lld\n", found);

    return 0;
}