Cod sursa(job #1598037)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 12 februarie 2016 16:13:36
Problema Invers Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <bits/stdc++.h>

//#define fin cin
//#define fout cout

#define F first
#define S second

using namespace std;

const int Nmax = 100000 + 10;

int n;
int nr[Nmax];

char s[Nmax] , ans[Nmax];

bool ok(int L , int R)
{
    int i , sum;
    if (L > R) return 0;

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

    if (L == 1 && nr[R] == 0) return 0;
    if (L == 2 && nr[1] != 1) return 0;

    for (nr[L] += nr[L-1] * 10; true ; L++, R--)
    {
        if (L == R)
        {
            ans[L] = nr[L] / 2 + '0';
            return nr[L] % 2 == 0;
        }
        if (L + 1 == R)
        {
            sum = nr[L]; if (nr[L] == nr[R] + 11) sum--;
            ans[L] = ans[R] = sum / 2 + '0'; if (sum&1) ans[L]++;
            return (nr[L] == nr[R] || nr[L] == nr[R] + 11);
        }

        if (nr[L] - nr[R] != 0 && nr[L] - nr[R] != 1
            && nr[L] - nr[R] != 10 && nr[L] - nr[R] != 11)
            return 0;

        sum = nr[L];
        if (nr[L] == nr[R]);
        if (nr[L] == nr[R] + 1 || nr[L] == nr[R] + 11)
            sum--, nr[L+1] += 10;
        if (nr[L] == nr[R] + 10 || nr[L] == nr[R] + 11)
        {
            if (nr[R] == 9) return 0; ///19

            for (i = R - 1; i >= L && nr[i] == 0; --i)
                nr[i] = 9;
            if (i == L) return 0;
            nr[i]--;
        }

        ans[L] = ans[R] = sum / 2 + '0'; if (sum&1) ans[L]++;

        int mata = 5;
    }

    return 1;
}

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

    gets(s+1); n = strlen(s+1);

    /*if (ok(1,n)) puts(ans+1);
    else if (ok(2,n)) puts(ans+2);
    else printf("0\n");*/

    if (ok(1,n)||ok(2,n)) puts("DA\n");
    else puts("NU\n");

    return 0;
}