Cod sursa(job #593798)

Utilizator cont_de_testeCont Teste cont_de_teste Data 4 iunie 2011 15:59:07
Problema Invers Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
# include <cstdio>
# include <cstring>

const char *FIN = "invers.in", *FOU = "invers.out" ;
char SS[10005];
int T, N ;

int check(char *s,int l, int n)
{
    int i, j, k;
    for (i = l, j = n - 1; 1; i++, j--)
    {
        if (i == j)
            return s[i] % 2 == 0;
        if (j - i == 1)
            return s[i] == s[j] || (s[i] == s[j] + 11);
        switch (s[i] - s[j])
        {
            case 0: break;
            case 1: s[i + 1] += 10; break;
            case 11:
                s[i + 1] += 10;
            case 10:
                if (s[j] == 9) return 0;
                for (s[k = j - 1]--; s[k] < 0 && k >= i; )
                   s[k] += 10, s[--k]--;
                if (k == i) return 0;
                break;
            default: return 0;
        }
    }
}
int check1 (char *S, int L, int N) {
    for (int i = L, j = N - 1, k; ; ++i, --j) {
        if (i == j) {
            return (S[i] & 1) == 0 ;
        } else if (j - i == 1) {
            return (S[i] == S[j] || (S[i] == S[j] + 11)) ;
        } else {
            if (S[i] - S[j] == 1) {
                S[i + 1] += 10 ;
            } else if (S[i] - S[j] == 11) {
                S[i + 1] += 10 ; return 0 ;
            } else if (S[i] - S[j] == 10) {
                if (S[j] == 9) return 0;
                for (--S[k = j - 1] ; S[k] < 0 && k >= i ; --S[--k])
                    S[k] += 10 ;
                if (k == i) return 0;
            } else if (S[i] - S[j] == 0) {
                continue ;
            } else {
                return 0 ;
            }
        }
    }
}
int solve(char *s, int n)
{
    int  i, j, k;
    //for (n = 0; s[n]; n++) s[n] -= '0';
    if (n == 1) return (s[0]) % 2 == 0;
    if (n == 2) return (s[0] == s[1]) || (s[0] == 1 && s[1] % 2 == 0);
    if (s[0] == 1)
    {
        //memcpy(s2, s, sizeof(s));
        s[1] += 10;
        if (check(s,1, n))
            return 1;
        else
            if (s[0] == 1 && s[n - 1] == 0)
                return 0;
            else
            {
                memcpy(s, SS, sizeof(SS));
                return check(s,0, n);
            }
    }
    else
        return check(s,0, n);
    return 0;
}

const char *solve1 (char *S, int N) {
    if (N == 1) return (S[0] & 1) ? "NU" : "DA";
    else if (N == 2) return (S[0] == S[1] || (S[0] == 1 && (S[1] & 1) == 0)) ? "DA" : "NU" ;
        else if (S[0] == 1) {
            S[1] += 10 ;
            if (check (S, 1, N)) return "DA" ;
            else if (S[0] == 1 && S[N - 1] == 0) {
                return "NU" ;
            } else {
                memcpy (S, SS, sizeof (SS)) ;
                return check (S, 0, N) ? "DA" : "NU" ;
            }
        } else {
            return check (S, 0, N) ? "DA" : "NU" ;
        }
    return "NU";
}

int main (void) {
    freopen (FIN, "r", stdin) ;
    freopen (FOU, "w", stdout) ;

    for (scanf ("%d", &T); T; --T) {
        scanf ("%s", SS) ;
        for (N = 0; SS[N]; SS[N++] -= '0') ;
        printf ("%s\n", solve (SS, N) ? "DA" : "NU") ;
    }
}