Cod sursa(job #630602)

Utilizator swift90Ionut Bogdanescu swift90 Data 5 noiembrie 2011 23:28:25
Problema Tm Scor Ascuns
Compilator cpp Status done
Runda Marime 1.9 kb
#include<cstdio>
using namespace std;
char S[1010];
struct Nod{
	char x;
	bool mar;
	Nod *urm,*prev;
	Nod(){
		x=0;
		urm=prev=NULL;
		mar=false;
	}
}*L;
Nod* add(char c,Nod *cc){
	Nod *ax=new Nod;
	ax->x=c;
	if(!cc)
		return ax;
	ax->prev=cc;
	cc->urm=ax;
	return ax;
}
void curat(Nod *x){
	Nod *ax;
	while(x){
		ax=x;
		x=x->urm;
		delete ax;
	}
}
void solve(){
	int i,ok;
	curat(L);
	L=add('B',0);
	Nod *ult=L;
	for(i=0;'a'==S[i];++i)
		ult=add(S[i],ult);
	for(;'b'==S[i];++i)
		ult=add(S[i],ult);
	if(S[i]=='a'){
		printf("NU\n");
		return;
	}
	for(;'c'==S[i];++i)
		ult=add(S[i],ult);
	if(S[i]=='a' || S[i]=='c'){
		printf("NU\n");
		return;
	}
	ult=add('B',ult);
	
	for(ok=1;ok;){
		ult=L->urm;
		while(ult->mar==true && ult->x=='a')
			ult=ult->urm;
		if(ult->x!='a')
			ok=0;
		else
			ult->mar=true;
		while(ult->x=='a' || (ult->x=='b' && ult->mar==true))
			ult=ult->urm;
		if(!ok){
			if(ult->x!='b'){
				printf("DA\n");
				return;
			}
			else{
				for(;ult->x=='b';ult=ult->prev)
					ult->mar=false;
			}
		}
		else{
			if(ult->x=='b')
				ult->mar=true;
			else{
				for(ult=ult->prev;ult->x=='b';ult=ult->prev)
					ult->mar=false;
				ok=0;
			}
		}
	}
	for(ok=1;ok;){
		ult=L->urm;
		for(;ult->x=='a' || (ult->x=='b' && ult->mar==true);ult=ult->urm);
		if(ult->x!='b')
			ok=0;
		else
			ult->mar=true;
		while(ult->x=='b' || (ult->x=='c' && ult->mar==true))
			ult=ult->urm;
		if(!ok){
			if(ult->x!='c'){
				printf("DA\n");
				return;
			}
			else{
				printf("NU\n");
				return;
			}
		}
		else{
			if(ult->x=='c')
				ult->mar=true;
			else
				ok=0;
		}
	}
	printf("NU\n");
}
int main(){
	freopen("tm.in","r",stdin);
	freopen("tm.out","w",stdout);
	int t;
	scanf("%d",&t);
	fgets(S,10,stdin);
	for(;t;--t){
		fgets(S,1010,stdin);
		solve();
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}