Cod sursa(job #603652)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 18 iulie 2011 11:16:27
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define maxn 10010

int t, n, i, j, k;
char s[maxn];
int v[maxn];

int verif(int st, int dr)
{
    int poz;
    while(1)
    {
        if(st==dr)
            return 1-(v[st]%2);
        if(st==dr-1)
            return (v[st]==v[dr] || v[st]==v[dr]+11);

        int diff=v[st]-v[dr];
        if(diff!=0 && diff!=1 && diff!=10 && diff!=11)
            return 0;

        if(diff==1 || diff==11)
            v[st+1]+=10;

        if(diff>=10)
        {
            if(v[dr]==9)
                return 0;
            poz=dr-1;
            while(v[poz]==0)
                v[poz--]=9;
            if(poz==st)
                return 0;
            --v[poz];
        }

        ++st;
        --dr;
    }

    return 1;
}

int main()
{
    freopen("invers.in", "r", stdin);
    freopen("invers.out", "w", stdout);

    scanf("%d\n", &t);
    while(t--)
    {
        memset(s, 0, sizeof(s));
        scanf("%s", s+1);
        n=strlen(s+1);

        for(int i=1; i<=n; ++i)
            v[i]=s[i]-'0';

        if(v[1]!=1 || v[n]>0)
        {
            if(verif(1, n))
            {
                printf("DA\n");
                continue;
            }
        }

        if(n==1 || s[1]!='1')
        {
            printf("NU\n");
            continue;
        }

        for(int i=1; i<n; ++i)
            v[i]=s[i+1]-'0';
        v[1]+=10;

        if(verif(1, n-1))
            printf("DA\n");
        else
            printf("NU\n");
    }

    return 0;
}