Cod sursa(job #603646)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 18 iulie 2011 11:00:10
Problema Invers Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define maxn 100010

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

int verif(int st, int dr)
{
    int poz;
    while(st<=dr)
    {
        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%10)
            v[st+1]+=10;

        if(diff>=10)
        {
            poz=dr-1;
            --v[poz];
            while(v[poz]==-1)
            {
                if(poz==st)
                    return 0;
                v[poz]=9;
                poz--;
                --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(verif(1, n))
        {
            printf("DA\n");
            continue;
        }

        if(n==1)
        {
            printf("NU\n");
            continue;
        }

        if(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;
}