#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';
}
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'; } |
English