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
85
86
87
88
89
90
91
92
// PA 2024 3C - Dodawanie
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

enum State { OK, START, CONT, END, NOTHING };

long long ctoll(char c) {
	return (int)c - 48;
}

int main()
{
	ios_base::sync_with_stdio(0);
	string a, b, c;
	long long n, a1, b1, c1, result, curr;
	State prev;
	vector<State> states; 
	
	cin >> a;
	cin >> b;
	cin >> c;
	n = a.length();
	result = 0;
	
	for (long long i = 0; i < n; ++i) {
		a1 = ctoll(a[i]);
		b1 = ctoll(b[i]);
		c1 = ctoll(c[i]);
		
		if (a1 + b1 == c1) {
			states.push_back(OK);
		} else if (a1 + b1 == c1 + 10) {
			states.push_back(START);
		} else if (a1 + b1 + 1 == c1) {
			states.push_back(END);
		} else if (a1 + b1 + 1 == c1 + 10) {
			states.push_back(CONT);
		} else {
			states.push_back(NOTHING);
		}
		
//		cout << states[i];
	}
//	cout << endl;
	
	curr = 0;
	prev = NOTHING;
	for (long long i = n - 1; i >= 0; --i) {
//		cout << i << " prev: " << prev << endl;
		if (prev == START) {
			switch(states[i]) {
			case CONT:
				break;
			case END:
				++curr;
				prev = states[i];
				break;
			default:
//				for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl;
				result += ((curr + 1) * curr) / 2;
				curr = 0;
				prev = states[i];
			}
			if (states[i] == OK) {
				++curr;
			}
		} else {		
			switch(states[i]) {
			case OK:
				++curr;
				prev = states[i];
				break;
			case START:
				prev = states[i];
				break;
			default:
//				for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << i + 1 << " " << i + 1 << endl;
				result += ((curr + 1) * curr) / 2;
				curr = 0;
				prev = states[i];
			}
		}
	}
//	for (int k = 0; k < (curr + 1) * curr / 2; ++k) cout << 0 << " " << 0 << endl;
	result += ((curr + 1) * curr) / 2;
	cout << result << endl;		
	
	return 0;
}