Cod sursa(job #1592636)

Utilizator cautionPopescu Teodor caution Data 7 februarie 2016 20:13:17
Problema Invers Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
//try #2
#include <fstream>
#include <string>

const int kMaxDigits = 10005;

bool hasProperty(int *number, int left, int right)
{
    while(right-left > 1) {
        if(number[left] > 19) return false;
        else if(number[left] == 19) {
            if(number[right] == 8) number[left+1] +=10;
            else return false;
            number[right-1] -=1;
        }
        else if(number[left] == 1) {
            if(number[right] != 1) return false;
        }
        else if(number[left] <= 9) {
            if(number[left] == number[right]+1) number[left+1] +=10;
            else if(number[left] != number[right]) return false;
        }
        else if(number[left] == 10) {
            if(number[right] == 9) number[left+1]+=10;
            else if(number[right] == 0) {
                number[right-1] -= 1;
            }
            else return false;
        }
        else {
            if(number[left]%10 == number[right]+1) number[left+1]+=10;
            else if(number[left]%10 != number[right]) return false;
            number[right-1] -= 1;
        }
        ++left;
        --right;
        for(int i = right; i > left && number[i] < 0; --i) {
            number[i] = 9;
            --number[i-1];
        }
        if(number[left] == -1) return false;
    }
    if(left == right) {
        if(number[left]%2) return false;
        else return true;
    }
    else {
        if(number[left] > 10) {
            if(number[left]-11 == number[right]) return true;
            else return false;
        }
        else if(number[left] <= 9){
            if(number[left] == number[right]) return true;
            else return false;
        }
        else return false;
    }
    return true;
}
int main()
{
    std::ifstream in("invers.in");
    std::ofstream out("invers.out");
    std::string string_number;
    int number[kMaxDigits];
    int n;
    in>>n;
    for(int i = 0; i < n; ++i) {
        bool has_property = false;
        in>>string_number;
        for(int j = 0; j < string_number.size(); ++j)
            number[j] = static_cast<int>(string_number[j]-'0');
        has_property = hasProperty(number, 0, string_number.size()-1);
        if(string_number[0] == '1') {
            for(int j = 0; j < string_number.size(); ++j)
                number[j] = static_cast<int>(string_number[j]-'0');
            number[1] += 10;
            has_property = has_property || hasProperty(number, 1, string_number.size()-1);
        }
        if(has_property) out<<"DA\n";
        else out<<"NU\n";
    }
    return 0;
}