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
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e6 + 2;
string add1, add2, sumOf;
ll dp[N];

int getSecondIdx(int idx){
    int a, b, w;
    for(int i = idx ; i >= 0 ; i--){
        a = add1[i] - '0';
        b = add2[i] - '0';
        w = sumOf[i] - '0';
        if(a + b + 1 == w) return i;
        if(a + b + 1 != w + 10) return -1;
    }
    return -1;
}

void dynamic(int n){
    int a, b, w;
    for(int i = 1 ; i <= n ; i++){
        a = add1[i - 1] - '0';
        b = add2[i - 1] - '0';
        w = sumOf[i - 1] - '0';
        if(a + b == w) dp[i] = dp[i - 1] + 1;
        else if(a + b == w + 10){
            int k = getSecondIdx(i - 2);
            if(k != -1){
                dp[i] = 1 + dp[k];
            }
        }
    }
}

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int n;
    cin >> add1 >> add2 >> sumOf;
    n = add1.size();
    dynamic(n);
    ll ans = 0;
    for(int i = 1 ; i <= n ; i++){
        ans += dp[i];
    }
    cout << ans << '\n';
}