Cod sursa(job #170884)

Utilizator razvi9Jurca Razvan razvi9 Data 3 aprilie 2008 13:41:03
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<cstdio>
#include<cstring>
int n,t,i;
char a[20001];
int b[20001];
int solve(int st,int dr)
{
	int j;
	while(st!=dr && st+1!=dr)
	{	
		if(b[st]==b[dr])
		{
			st++;
			dr--;
		}
		else
			if(b[st]==b[dr]+1)
			{
				st++;
				dr--;
				b[st]+=10;
			}
			else
				if(b[st]==b[dr]+10)
				{
					if(b[dr]==9) 
						return 0;
					st++;
					dr--;
					b[dr]--;
					j=dr;
					while(j>st && b[j]<0){
						b[j]=9;
						b[j-1]--;
						j--;}
					if(j==st && b[st]<0) 
						return 0;
				}
				else
					if(b[st]==b[dr]+11)
					{
						if(b[dr]==9)
							return 0;
						st++;
						dr--;
						b[dr]--;
						b[st]+=10;
						j=dr;
						while(j>st && b[j]<0){
							b[j]=9;
							b[j-1]--;
							j--;}
						if(j==st && b[st]<0) 
							return 0;
					}
					else
						return 0;
	}
	if(st==dr) 
		return b[st]%2==0;
	return b[st]==b[dr] || b[st]-11==b[dr];
}
int main()
{
	freopen("invers.in","r",stdin);
	freopen("invers.out","w",stdout);
	scanf("%d ",&t);
	for(;t;t--){
		gets(a);
		n=strlen(a);
		for(i=0;i<n;i++)
		{
			a[i]-='0';
			b[i]=a[i];
		}
		if(n==1)
			if(a[0]%2==0)
				printf("DA\n");
			else 
				printf("NU\n");
		else
			if(n==2)
				if(a[0]==a[1])
					printf("DA\n");
				else
					if(a[0]==1 && (a[0]*10+a[1])%2==0)
						printf("DA\n");
					else
						printf("NU\n");
			else
				if((a[0]!=1 || (a[0]==1 && a[n-1]!=0)) && solve(0,n-1)) 
					printf("DA\n");
				else
					if(a[0]==1)
					{
						for(i=0;i<n;i++)b[i]=a[i];
						b[1]+=10;
						if(solve(1,n-1)) 
							printf("DA\n");
						else	
							printf("NU\n");
					}
					else
						printf("NU\n");
	}
	fclose(stdout);
	return 0;
}