Cod sursa(job #3310341)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 13 septembrie 2025 01:02:09
Problema Invers Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

bool check(string &str, bool flag) {
	int n = str.size();
	vector <int> v(n);
	
	for (int i = 0; i < n; i++) {
		v[i] = str[n - i - 1] - '0';
	}

	if (!flag && v[0] == 0) {
		return 0;
	}

	if (flag) {
		if (n == 1) {
			return 0;
		}
		v[n - 2] += 10 * v[n - 1];
		v.pop_back();
	}
	int l = 0, r = v.size() - 1;
	for (; l + 1 < r; l++, r--) {
		// for (int i = v.size() - 1; i >= 0; i--) {
		// 	cout << v[i] << ' ';
		// }
		// cout << '\n';

		if (v[l] > 9 || v[r] > 19) {
			return 0;
		}

		if (v[l] < 0 ) {
			v[l] += 10;
			v[l + 1]--;
		}

		if (v[l] == v[r]) {
			// cout << "caz 0\n";
			continue;
		}
		

		if (v[l] + 1 == v[r]) {
			v[r - 1] += 10;
			// cout << "caz 1\n";
			continue;
		}

		if (v[l] < 9 && v[l] + 10 == v[r]) {
			v[l + 1]--;
			// cout << "caz 2\n";
			continue;
		}

		if (v[l] + 11 == v[r]) {
			v[l + 1]--;
			v[r - 1] += 10;
			// cout << "caz 3\n";
			continue;
		}

		return 0;
	}
	if (l == r) {
		return v[l] < 19 && v[l] % 2 == 0;
	}
	return v[l] == v[r] || (v[l] + 11 == v[r] && v[r] < 20);
	
}

void solve() {
	string str;
	cin >> str;
	if (check(str, 0) || check(str, 1)) {
		cout << "DA\n";
	} else {
		cout << "NU\n";
	}
}

signed main()
{
#ifdef LOCAL
    assert(freopen("test.in", "r", stdin));
    assert(freopen("test.out", "w", stdout));
#else
    assert(freopen("invers.in", "r", stdin));
    assert(freopen("invers.out", "w", stdout));
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int nrt = 1;
    cin >> nrt;
    while (nrt--) {
        solve();
    }
    return 0;
}