???

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN = 1e5 + 5;

char _a[MAXN], _b[MAXN], _c[MAXN];
int a[MAXN], b[MAXN], c[MAXN];
int sa, sb, sc;

int x, y, z;

int apb[MAXN], sapb;
int cma[MAXN], scma;
int cmb[MAXN], scmb;
int x1, y1, z1;
int x2, y2, z2;
int x3, y3, z3;

int tmp[MAXN];

void calcapb() {
    memset(apb, 0, sizeof(apb));
    int b1 = 0;
    for(int i = 0; i < sa; ++i) {
        if(a[i] != 0) {
            b1 = i;
            break;
        }
    }
    int b2 = 0;
    for(int i = 0; i < sb; ++i) {
        if(b[i] != 0) {
            b2 = i;
            break;
        }
    }
    sapb = max(sa - b1, sb - b2);
    int cnt = 0, f = 0;
    for(int i = 0; i < sapb; ++i) {
        apb[i] += a[i + b1] + b[i + b2];
        if(apb[i] >= 10) {
            ++apb[i + 1];
            apb[i] -= 10;
        }
        if(apb[i] == 0 && f == 0)
            cnt++;
        else if(apb[i] != 0)
            f = 1;
    }
    if(apb[sapb] != 0)
        ++sapb;
    if(b2 > b1) {
        x1 = b2 - b1;
        y1 = 0;
        z1 = cnt;
    } else {
        y1 = b1 - b2;
        x1 = 0;
        z1 = cnt;
    }
}

void calccma() {
    memset(cma, 0, sizeof(cma));
    int b1 = 0;
    for(int i = 0; i < sc; ++i) {
        if(c[i] != 0) {
            b1 = i;
            break;
        }
    }
    int b2 = 0;
    for(int i = 0; i < sa; ++i) {
        if(a[i] != 0) {
            b2 = i;
            break;
        }
    }

    scma = max(sc - b1, sa - b2);
    int cnt = 0, f = 0;
    for(int i = 0; i < scma; ++i) {
        cma[i] += c[i + b1] - a[i + b2];
        if(cma[i] < 0) {
            --cma[i + 1];
            cma[i] += 10;
        }

        if(cma[i] == 0 && f == 0)
            cnt++;
        else if(cma[i] != 0)
            f = 1;
    }
    if(cma[scma] != 0)
        ++scma;
    if(b2 > b1) {
        z2 = b2 - b1;
        x2 = 0;
        y2 = cnt;
    } else {
        x2 = b1 - b2;
        z2 = 0;
        y2 = cnt;
    }
}

void calccmb() {
    memset(cmb, 0, sizeof(cmb));
    int b1 = 0;
    for(int i = 0; i < sc; ++i) {
        if(c[i] != 0) {
            b1 = i;
            break;
        }
    }
    int b2 = 0;
    for(int i = 0; i < sb; ++i) {
        if(b[i] != 0) {
            b2 = i;
            break;
        }
    }

    scmb = max(sc - b1, sb - b2);
    int cnt = 0, f = 0;
    for(int i = 0; i < scmb; ++i) {
        cmb[i] += c[i + b1] - b[i + b2];
        if(cmb[i] < 0) {
            --cmb[i + 1];
            cmb[i] += 10;
        }
        if(cmb[i] == 0 && f == 0)
            cnt++;
        else if(cmb[i] != 0)
            f = 1;
    }

    if(cmb[scmb] != 0)
        ++scmb;
    if(b2 > b1) {
        z3 = b2 - b1;
        y3 = 0;
        x3 = cnt;
    } else {
        y3 = b1 - b2;
        z3 = 0;
        x3 = cnt;
    }
}


bool solveapb() {
    int b1 = 0;
    for(int i = 0; i < sapb; ++i) {
        if(apb[i] != 0) {
            b1 = i;
            break;
        }
    }
    int b2 = 0;
    for(int i = 0; i < sc; ++i) {
        if(c[i] != 0) {
            b2 = i;
            break;
        }
    }
    if(sapb - b1 != sc - b2)
        return false;
    for(int i = 0; i < sapb - b1; ++i) {
        if(apb[i + b1] != c[i + b2])
            return false;
    }
    if(b2 > b1) {
        x1 += b2 - b1;
        y1 += b2 - b1;
        z1 += 0;
    } else {
        z1 += b2 - b1;
    }
    return true;
}

bool solvecma() {
    int b1 = 0;
    for(int i = 0; i < scma; ++i) {
        if(cma[i] != 0) {
            b1 = i;
            break;
        }
    }
    int b2 = 0;
    for(int i = 0; i < sb; ++i) {
        if(b[i] != 0) {
            b2 = i;
            break;
        }
    }
    if(scma - b1 != sb - b2)
        return false;
    for(int i = 0; i < scma - b1; ++i) {
        if(cma[i + b1] != b[i + b2])
            return false;
    }

    if(b2 > b1) {
        x2 += b2 - b1;
        z2 += b2 - b1;
    } else {
        y2 += b1 - b2;
    }
    return true;
}

bool solvecmb() {
    int b1 = 0;
    for(int i = 0; i < scmb; ++i) {
        if(cmb[i] != 0) {
            b1 = i;
            break;
        }
    }
    puts("C-B=");
    for(int i = scmb - 1; i >= 0; --i) {
        printf("%d", cmb[i]);
    }
    puts("");
    int b2 = 0;
    for(int i = 0; i < sa; ++i) {
        if(a[i] != 0) {
            b2 = i;
            break;
        }
    }
    if(scmb - b1 != sa - b2)
        return false;
    for(int i = 0; i < scmb - b1; ++i) {
        if(cmb[i + b1] != a[i + b2])
            return false;
    }

    cout << "b2=" << b2 << " b1=" << b1 << endl;
    if(b2 > b1) {
        y3 += b2 - b1;
        z3 += b2 - b1;
    } else {
        x3 += b1 - b2;
    }
    return true;
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int T;
    while(~scanf("%d", &T)) {
        while(T--) {
            scanf("%s%s%s", _a, _b, _c);
//            printf("A=
  %s
", _a);
//            printf("B=
  %s
", _b);
//            printf("C=
  %s
", _c);
            sa = strlen(_a), sb = strlen(_b), sc = strlen(_c);
            reverse(_a, _a + sa);
            reverse(_b, _b + sb);
            reverse(_c, _c + sc);
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(c, 0, sizeof(c));
            for(int i = 0; i < sa; ++i)
                a[i] = _a[i] - '0';
            for(int i = 0; i < sb; ++i)
                b[i] = _b[i] - '0';
            for(int i = 0; i < sc; ++i)
                c[i] = _c[i] - '0';

//            puts("A2=");
//            for(int i = 0; i < sa; ++i) {
//                printf("%d", a[i]);
//            }
//            puts("");

            calcapb();
//            puts("A+B=");
//            cout << "len=" << sapb << endl;
//            for(int i = sapb - 1; i >= 0; --i) {
//                printf("%d", apb[i]);
//            }
//            puts("");

            if(solveapb()) {
                printf("1:%d %d %d
", x1, y1, z1);
                continue;
            }

            calccma();

            /*for(int i=scma-1;i>=0;--i){
                printf("%d",cma[i]);
            }
            puts("");*/

            if(cma[scma] >= 0 && solvecma()) {
                printf("2:%d %d %d
", x2, y2, z2);
                continue;
            }

            calccmb();

            /*for(int i=scma-1;i>=0;--i){
                printf("%d",cma[i]);
            }
            puts("");*/

            if(cmb[scmb] >= 0 && solvecmb()) {
                printf("3:%d %d %d
", x3, y3, z3);
                continue;
            }

            puts("-1");
            continue;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Yinku/p/11341207.html