Cod sursa(job #1219107)

Utilizator apopeid15Apopei Daniel apopeid15 Data 13 august 2014 14:15:56
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <string>
 
bool test(std::string s){
    if(s[0]=='1'&&s[s.size()-1]=='0') return false;
    else if(s.size()==1) return !((s[0]-'0')&1);
    else{
        unsigned l=0,r=s.size()-1;
        unsigned possible=true;
 
        while(possible&&l<=r){
            if(l==r) possible=((s[l]-'0')&1)==0;
            else if(l+1==r){
                if(s[l]!=s[r]&&s[l]!=s[r]+11) possible=false;
            }
            else if(s[l]==s[r]);
            else if(s[l]==s[r]+1) s[l+1]+=10;
            else if(s[l]-s[r]==10){
                if(s[r]=='9') possible=false;
                else if(s[r-1]=='0'){
                    unsigned r2;
                    for(r2=r-1;s[r2]=='0';--r2);
                    if(r2==l) possible=false;
                    s[r2]--; ++r2; for(;r2<r;++r2) s[r2]='9';
                }
                else --s[r-1];
            }
            else if(s[l]-s[r]==11){
                s[l+1]+=10;
 
                if(s[r]=='9') possible=false;
                else if(s[r-1]=='0'){
                    unsigned r2;
                    for(r2=r-1;s[r2]=='0';--r2);
                    if(r2==l) possible=false;
                    s[r2]--; ++r2; for(;r2<r;++r2) s[r2]='9';
                }
                else --s[r-1];
            }
            else possible=false;
            ++l; --r;
        }
 
        return possible;
    }
}
 
int main(){
    std::ifstream fin("invers.in");
    std::ofstream fout("invers.out");
 
    int T; fin>>T;
 
    while(T--){
        std::string s; fin>>s;
        bool retval=false;
 
        if(s.size()>1&&s[0]=='1'){
            std::string s2(s,1);
            s2[0]+=10;
            retval=test(s2);
        }
        if(!retval) retval=test(s);
 
        if(retval) fout<<"DA\n";
        else fout<<"NU\n";
    }
 
}