Cod sursa(job #493138)

Utilizator funkydvdIancu David Traian funkydvd Data 17 octombrie 2010 12:01:27
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
using namespace std;
int n,v[10002];
char s[10002];
int ok ()
{
	int st = 1, dr = n, i, d;
	while (1)
	{
		d = v[st] - v[dr];
		if (d != 0 && d != 1  && d != 10 && d != 11) return 0;
		if (st == dr) return v[st] % 2 == 0;
		if (st == dr - 1) return (v[st] == v[dr]) || (v[st] == v[dr] + 11);
		if (d == 1 || d == 11) v[st + 1] += 10; // primeste transport de la v[st+1]
		if (d >= 10 && v[dr] == 9) return 0; 
		if (d >= 10) // scade v[dr-1] deoarece a primit transport
		{
			for (i = dr - 1; v[i] == 0; i --) v[i] = 9;
			v[i] --;
			if (i == st) return 0;
		}
		st ++, dr --;
	}
}
int rez ()
{
	int i;
	if (n == 1) return s[1]%2==0;
	for (i = 1; i <= n; i ++) v[i] = s[i];
    if (v[1] != 1 || v[n])
        if (ok ()) return 1;
	if (v[1] != 1) return 0;
	for (i = 2; i <= n; i ++) v[i - 1] = s[i];
	v[1] += 10;
	n --;
	return ok ();
}
int main ()
{
	freopen ("invers.in", "r", stdin);
	freopen ("invers.out", "w", stdout);
	int t;
	scanf ("%d\n", &t);
	while (t --)
	{
		gets (s + 1);
		for (n = 1; s[n]; n ++) s[n] -= '0';
		n --;
		if (rez ()) printf ("DA\n");
		else printf ("NU\n");
	}
	return 0;
}