Cod sursa(job #605034)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 26 iulie 2011 16:47:15
Problema Invers Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>

const int N = 10005;

int n, a[N];

void read() {
  char s[N];

  gets(s + 1);

  n = 0;

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

bool solve(int st, int dr) {
  int p, dc;

  while (1) {
    if (st == dr)
      return 1 - (a[st] % 2);

    if (st == dr - 1)
      return (a[st] == a[dr] || a[st] == a[dr] + 11);

    dc = a[st] - a[dr];

    if (dc != 0 && dc != 1 && dc != 10 && dc != 11)
      return 0;

    if (dc % 10 == 1)
      a[st + 1] += 10;

    if (dc >= 10) {
      if (a[dr] == 9)
        return 0;

      p = dr - 1 ;

      while (a[p] == 0) {
        a[p] = 9;
        -- p;
      }

      if (p == st)
        return 0;

      -- a[p];
    }

    ++ st;
    -- dr;
  }
}

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

  int T = 0;

  scanf("%d\n", &T);

  for (; T > 0; -- T) {
    read();

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

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

    a[2] += 10;

    if(solve(2, n))
      printf("DA\n");
    else
      printf("NU\n");
  }

  return 0;
}