Cod sursa(job #1592762)

Utilizator cautionPopescu Teodor caution Data 7 februarie 2016 22:17:42
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
//try #2
#include <fstream>
#include <string>
#include <iostream>
const int kMaxDigits = 10005;

//I AM NOT COMPLETLY SURE WHY IT WORKS
//FUCKING TRIAL AND ERROR
bool hasProperty(int *number, int left, int right)
{
    bool ind = true; //ugly ass variable
    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 && ind && 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;
        }
        ind = false;
        int i;
        for(i = right-1; number[i] < 0; --i) {
            number[i] = 9;
            --number[i-1];
        }
        if(i == left) return false;
        ++left;
        --right;
    }
    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;
}
bool brute_force(int number)
{
    for(int i = 0; i <= number; ++i)
    {
        int aux = 0, x = i;
        while(x) {
            aux = aux*10 + x%10;
            x/=10;
        }
        if(i+aux==number) return true;
    }
    return false;
}
int test_up_to(int limit)
{
    int number1[kMaxDigits];
    int number2[kMaxDigits];
    for(int i = 0; i <= limit; ++i) {
        bool testing = brute_force(i);
        int x = i, n_digits = 0;
        while(x) {
            for(int j = n_digits; j >= 1; --j) {
                number1[j] = number1[j-1];
                number2[j] = number2[j-1];
            }
            number1[0] = x%10;
            number2[0] = number1[0];
            ++n_digits;
            x /= 10;
        }
        if(number2[0] == 1) number2[1] += 10;
        if((hasProperty(number1, 0, n_digits-1) || (number2[0] == 1 && hasProperty(number2, 1, n_digits-1))) != testing) {
            std::cout<<i<<' '<<testing<<'\n';
        }
    }
}
int main()
{
  //  test_up_to(100001);
    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;
}