Cod sursa(job #1017335)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 27 octombrie 2013 17:46:46
Problema Invers Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>

char S[10100];
int x[10100];

int solve(int st, int dr) {
    while (st <= dr) {
        if (st == dr)
            return 1 - x[st] % 2;
        if (st + 1 == dr)
            return (x[st] == x[dr] || x[st] - x[dr] == 11);
        int diff = x[st] - x[dr];
        if (diff == 0 || diff == 1 || diff == 10 || diff == 11) {
            if (diff == 1 || diff == 11)
                x[st + 1] += 10;
            if (diff >= 10) {
                if (x[dr] == 9)
                    return 0;
                int i;
                for (i = dr - 1; i > st && x[i] == 0; --i)
                    x[i] = 9;
                --x[i];
                if (i == st)
                    return 0;
            }
        } else
            return 0;
        ++st;
        --dr;
    }
    return 1;
}

int solve2(int st, int dr) {
    if (x[1] != 1)
        return 0;
    if (dr == 1)
        return 0;
    x[2] += 10;
    return solve(2, dr);
}

int main() {
    freopen("invers.in", "r", stdin);
    freopen("invers.out", "w", stdout);

    int T;
    scanf("%d\n", &T);
    while (T--) {
        gets(S + 1);
        int n = strlen(S + 1);
        for (int i = 1; i <= n; ++i)
            x[i] = S[i] - '0';
        int ok = solve(1, n);
        if (ok == 0)
            ok = solve2(1, n);
        printf("%s\n", ok ? "DA" : "NU");
    }

    return 0;
}