Cod sursa(job #1751993)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 2 septembrie 2016 14:59:08
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <cstring>
#define MAXN 10050

char s[MAXN];
int x[MAXN];

int solve(int st, int dr)
{
    for ( ; true ; st++, dr--) {
        if (st == dr)
            return !(x[st] & 1);
        if (st == dr - 1)
            return x[st] - x[dr] == 0 || x[st] - x[dr] == 11;
        int dif = x[st] - x[dr];
        if (dif != 0 && dif != 1 && dif != 10 && dif != 11) return 0;
		x[st+1] += 10 * (dif%10);
		if (dif >= 10) {
			if (x[dr] == 9) return 0;
			int i;
			for (i = dr - 1; x[i] == 0; i--)
				x[i] = 9;
			x[i]--;
			if (i == st)
				return 0;
		}
    }
    return 1;
}

int solve2(int st, int dr)
{
    if (x[1] != 1) return 0;
    for (int i = 1; i < dr; ++i)
        x[i] = s[i + 1] - '0';
    x[1] += 10;
    return solve(1, dr - 1);
}

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 = 0;
        if (x[n] > 0)
            ok = solve(1, n);
		ok |= solve2(1, n);
        printf(ok ? "DA\n" : "NU\n");
    }

    return 0;
}