#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_N 1000005
#ifndef DEB_VAL
#define DEB_VAL 0
#endif
#define DEB if(debug)
#define MP make_pair
#define PB push_back
#define FT first
#define SD second
int debug = DEB_VAL;
int n;
char a[MAX_N];
char b[MAX_N];
char c[MAX_N];
long long res;
long long len;
int main() {
scanf("%s", a);
scanf("%s", b);
scanf("%s", c);
for(int i=0;i<MAX_N;i++) {
if(a[i]==0) {
n=i;
break;
}
a[i]-='0';
b[i]-='0';
c[i]-='0';
}
int left,right;
left=n-1;right=n-1;
int p=0;
while(left>=0) {
if(p==0) {
if(a[left]+b[left]+p==c[left]) {
DEB printf("left: %d, right:%d, p: %d, -> eq\n",left,right,p);
len++;
left--;
} else if (a[left]+b[left]+p-10==c[left]) {
DEB printf("left: %d, right:%d, p: %d, -> eq + p\n",left,right,p);
p=1;
left--;
} else {
DEB printf("left: %d, right:%d, p: %d, -> diff\n",left,right,p);
DEB printf("len: %lld, dodaje:%lld\n",len, len*(len+1)/2);
res+=len*(len+1)/2;
len=0;
left--;
right=left;
}
} else {
//p=1
if(a[left]+b[left]+p==c[left]) {
DEB printf("left: %d, right:%d, p: %d, -> eq\n",left,right,p);
left--;
len++;
p=0;
} else if (a[left]+b[left]+p-10==c[left]) {
DEB printf("left: %d, right:%d, p: %d, -> eq + p\n",left,right,p);
p=1;
left--;
} else {
DEB printf("left: %d, right:%d, p: %d, -> diff\n",left,right,p);
DEB printf("len: %lld, dodaje:%lld\n",len, len*(len+1)/2);
res+=len*(len+1)/2;
len=0;
right=left;
p=0;
}
}
}
DEB printf("koniec -> len: %lld, dodaje:%lld\n",len, len*(len+1)/2);
res+=len*(len+1)/2;
printf("%lld",res);
return 0;
}
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 | #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define MAX_N 1000005 #ifndef DEB_VAL #define DEB_VAL 0 #endif #define DEB if(debug) #define MP make_pair #define PB push_back #define FT first #define SD second int debug = DEB_VAL; int n; char a[MAX_N]; char b[MAX_N]; char c[MAX_N]; long long res; long long len; int main() { scanf("%s", a); scanf("%s", b); scanf("%s", c); for(int i=0;i<MAX_N;i++) { if(a[i]==0) { n=i; break; } a[i]-='0'; b[i]-='0'; c[i]-='0'; } int left,right; left=n-1;right=n-1; int p=0; while(left>=0) { if(p==0) { if(a[left]+b[left]+p==c[left]) { DEB printf("left: %d, right:%d, p: %d, -> eq\n",left,right,p); len++; left--; } else if (a[left]+b[left]+p-10==c[left]) { DEB printf("left: %d, right:%d, p: %d, -> eq + p\n",left,right,p); p=1; left--; } else { DEB printf("left: %d, right:%d, p: %d, -> diff\n",left,right,p); DEB printf("len: %lld, dodaje:%lld\n",len, len*(len+1)/2); res+=len*(len+1)/2; len=0; left--; right=left; } } else { //p=1 if(a[left]+b[left]+p==c[left]) { DEB printf("left: %d, right:%d, p: %d, -> eq\n",left,right,p); left--; len++; p=0; } else if (a[left]+b[left]+p-10==c[left]) { DEB printf("left: %d, right:%d, p: %d, -> eq + p\n",left,right,p); p=1; left--; } else { DEB printf("left: %d, right:%d, p: %d, -> diff\n",left,right,p); DEB printf("len: %lld, dodaje:%lld\n",len, len*(len+1)/2); res+=len*(len+1)/2; len=0; right=left; p=0; } } } DEB printf("koniec -> len: %lld, dodaje:%lld\n",len, len*(len+1)/2); res+=len*(len+1)/2; printf("%lld",res); return 0; } |
English