Cod sursa(job #593814)

Utilizator SpiderManSimoiu Robert SpiderMan Data 4 iunie 2011 16:16:42
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
# include <fstream>
# include <cstring>
# include <string>
using namespace std ;

const char *FIN = "invers.in", *FOU = "invers.out" ;

string S, S1 ;
int T, N ;

int check (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] == 0 || (S[i] - S[j] == 11)) ;
        } else {
            if (S[i] - S[j] == 0) {
                continue ;
            } else if (S[i] - S[j] == 1) {
                S[i + 1] += 10 ;
            } else if (S[i] - S[j] == 10 || S[i] - S[j] == 11) {
                if (S[i] - S[j] == 11) S[i + 1] += 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 {
                return 0 ;
            }
        }
    }
}

string solve (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) {
        S1 = S, S[1] += 10 ;
        if (check (1, N)) return "DA" ;
        else if (S[0] == 1 && S[N - 1] == 0) {
            return "NU" ;
        } else {
            S = S1 ;
            return check (0, N) ? "DA" : "NU" ;
        }
    } else {
        return check (0, N) ? "DA" : "NU" ;
    }
    return "NU";
}

int main (void) {
    ifstream f (FIN) ;
    ofstream g (FOU) ;

    for (f >> T; T; --T) {
        f >> S ;
        for (N = 0; S[N]; S[N++] -= '0') ;
        g << solve (N) << '\n';
    }
}