Cod sursa(job #478024)

Utilizator freak93Adrian Budau freak93 Data 17 august 2010 10:01:24
Problema Invers Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<cstring>

using namespace std;

const char iname[]="invers.in";
const char oname[]="invers.out";
const int maxn=10005;

char s[maxn];

int n,a[maxn],i,t;

bool test(char *s,int n)
{
    int i,j,k;
    for(i=1,j=n;;++i,--j)
    {
        if(i==j)
            if(s[i]%2)
                return false;
            else
                return true;
        if(j-i==1)
            return (s[i]==s[j]+11||s[i]==s[j]);
        if(s[i]==s[j]+1||s[i]==s[j]+11)
            s[i+1]+=10;
        if(s[i]==s[j]+11||s[i]==s[j]+10)
        {
            if(s[j]==9)
                return false;
            for(s[k=j-1]--;s[k]<0&&k>=i;--k)
                s[k]+=10,--s[--k];
            if(k==i)
                return false;
        }
        if(s[i]-s[j]<0||(s[i]-s[j]>1&&s[i]-s[j]<10)||(s[i]-s[j]>11))
            return false;
    }
}

bool calc()
{
    for(n=1;s[n]&&s[n]!='\n';++n)
        s[n]-='0';
    --n;
    char s2[maxn];
    memcpy(s2,s,sizeof(s2));
    if((s2[1]!=1||s2[n]!=0))
        if(test(s2,n))
            return true;
    if(n==1||s[1]!=1)
        return false;
    s[2]+=10;
    if(test(s+1,n-1))
        return true;
    return false;
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    scanf("%d\n",&t);
    while(t--)
    {
        scanf("%s\n",s+1);
        if(calc())
            printf("DA\n");
        else
            printf("NU\n");
    }
}