Cod sursa(job #2711005)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 23 februarie 2021 16:02:00
Problema Invers Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("invers.in");
ofstream fout("invers.out");

string s;

bool check(int start, int N) {
    for(int i = start, j = N - 1; i <= j; ++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 false;
                int k = j - 1;
                --s[k];
                while(s[k] < 0 && k >= i)
                    s[k] += 10, s[--k]--;
                if(k == i)
                    return false;
                break;
            }
            default:
                return false;
        }
    }
}

bool solve() {
    for(char &c : s)
        c -= '0';
    int N = s.size();
    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) {
        string t = s;
        s[1] += 10;
        if(check(1, N))
            return true;
        if(s[0] == 1 && s[N - 1] == 0)
            return false;
        s = t;
        return check(0, N);
    }
    else
        return check(0, N);
}

void test_case() {
    fin >> s;
    fout << (solve() ? "DA\n" : "NU\n");
}

int main() {
    int T;
    fin >> T;
    for(int tc = 0; tc < T; ++tc)
        test_case();
}