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
#pragma GCC optimize("O3,unroll-loops")
#include "bits/stdc++.h"
using namespace std;
#define rep(i,a,b) for(int i=(a); i<(b); ++i)
#define all(x) x.begin(),x.end()
#define sz(x) int(x.size())
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;

const ll p1 = 51908241602414719;
const ll p2 = 68745442202597681;

ll nc2(ll n){
    return n*(n-1)/2;
}

int main(){
    cin.tie(NULL),ios::sync_with_stdio(false);
    
    string a,b,c; cin >> a >> b >> c;
    int n = sz(a);

    reverse(all(a));
    reverse(all(b));
    reverse(all(c));

    map<pair<ll,ll>,int> cnt;
    cnt[{0,0}] = 1;
    ll c1 = 0, c2 = 0, pow1 = 1, pow2 = 0;
    rep(i,0,n){
        int cval = (int(a[i]) + int(b[i]) - int(c[i]) - int('0'));
        c1 = (c1 + pow1 * cval) % p1;
        c1 = (c1 < 0 ? c1 + p1 : c1);

        c2 = (c2 + pow2 * cval) % p2;
        c2 = (c2 < 0 ? c2 + p2 : c2);

        pow1 = pow1 * 10 % p1;
        pow2 = pow2 * 10 % p2;

        cnt[{c1, c2}]++;
    }

    ll ans = 0;
    for(auto [k,v] : cnt) ans += nc2(v);

    cout << ans << '\n';
}