Pagini recente » Cod sursa (job #579561) | Cod sursa (job #499597) | Cod sursa (job #1922599) | Cod sursa (job #3184571) | Cod sursa (job #58529)
Cod sursa(job #58529)
#include<fstream.h>
#include<iomanip.h>
#include<string.h>
char nr[1000000];
int v[1000000];
long t;
void transf(int);
int verificare(int);
void caz1(int,int);
int caz2(int,int);
void scadere(int);
int bun(int,int,int);
int nr_nubun(int);
int main()
{int i,e,k,lung;
char ch;
fstream f("invers.in",ios::in);
fstream f1("invers.out",ios::out);
f>>t;
for (i=1;i<=t;i++)
{f>>nr;
lung=strlen(nr);
transf(lung);
e=verificare(lung);
if (e) f1<<"DA\n"; //<<nr<<endl;
else f1<<"NU\n"; //<<nr<<endl;
}
f1.close();
f.close();
return 0;
}
void transf(int n)
{int i;
for (i=0;i<n;i++) v[i+1]=(int)nr[i]-48;}
int verificare(int n)
{int ok=1,s=1,d=n,nr,i,inv;
if (n==1) {if (v[1]%2!=0) ok=0;}
else if (n==2) {nr=v[1]*10+v[2];ok=0;
for (i=5;i<nr;i++)
{if (i<10) inv=i;
else inv=i%10*10+i/10;
if (i+inv==nr) ok=1;}
}
else
{if (nr_nubun(n)) ok=0;
if (v[1]==1 && bun(1,n,n)) {v[2]=v[2]+10;s=2;}
while (s!=d && d!=s+1 && ok)
{if (v[s]==v[d]+1) caz1(s,d);
else if (v[s]==v[d]+10) ok=caz2(s,d);
else if (v[s]==v[d]+11) {caz1(s,d);ok=caz2(s,d);}
else if (v[s]==v[d]);
else ok=0;
s=s+1;d=d-1;
}
if (s==d && ok) if (v[s]%2!=0) ok=0;
if (d==s+1 && ok) {if (v[s]==v[d]) ok=1;
else if (v[s]==v[d]+11) ok=1;
else ok=0;}
}
return ok;
}
void caz1(int s,int d)
{v[s+1]=v[s+1]+10;}
int caz2(int s,int d)
{int ok=1;
if (v[s]==19 && v[d]==9) ok=0;
else if (v[d-1]==0) {v[d-1]=9;scadere(d-2);}
else v[d-1]--;
return ok;}
void scadere(int poz)
{if (v[poz]==0) {v[poz]=9;scadere(poz-1);}
else v[poz]--;
}
int bun(int s,int d,int n)
{if (s==d && ((v[s]==1 && v[s-1]==1 && v[d+1]==1)||v[s]%2!=0)) return 1;
if (s==1 && v[d]!=1) return 1;
if ((s==d && v[s]%2==0)||(d==s-1)) return 0;
if ((v[s]==v[d] && n%2==0) || ((v[s]==v[d]+1 || v[s]==v[d]) && n%2!=0)) return bun(s+1,d-1,n);
else return 1;
}
int nr_nubun(int lung)
{int ok=0,s=1,d=lung;
if (v[s]==1 && v[s+1]==0 && v[d]==0 && v[d-1]==0)
{ok=1;
while (s!=d-1) {if (v[s]!=0) ok=0; s++;}
}
return ok;
}