Cod sursa(job #633926)

Utilizator theep0Cruceru Radu theep0 Data 15 noiembrie 2011 08:39:51
Problema Tm Scor 0
Compilator cpp Status done
Runda arhiva-teme-fmi Marime 6.59 kb
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

char tape[1024];
int head = 0;
int state = 1;


struct tmtf
{
	int to_state;
	int marker;
	int direction;
};

tmtf transformation_function[15][7];

void init_transformation_function()
{
	//(q1,a) -> (q2,a',->)
	transformation_function[1][0].to_state = 2;
	transformation_function[1][0].marker = 4;
	transformation_function[1][0].direction = 1;
	
	//(q1,b) -> (q8,b,-)
	transformation_function[1][1].to_state = 8;
	transformation_function[1][1].marker = 0;
	transformation_function[1][1].direction = 0;
	
	//(q1,c) -> (q-1,c,-)
	transformation_function[1][2].to_state = -1;
	transformation_function[1][2].marker = 0;
	transformation_function[1][2].direction = 0;
	
	//(q8,b) -> (q5,b,-) //check only for b and c
	transformation_function[8][1].to_state = 5;
	transformation_function[8][1].marker = 0;
	transformation_function[8][1].direction = 0;
	
	//(q8,c) -> (q-1,c,-)
	transformation_function[8][2].to_state = -1;
	transformation_function[8][2].marker = 0;
	transformation_function[8][2].direction = 0;
	
	//(q2,a) -> (q2,a,->)
	transformation_function[2][0].to_state = 2;
	transformation_function[2][0].marker = 0;
	transformation_function[2][0].direction = 1;
	
	//(q2,b') -> (q2,b',->)
	transformation_function[2][5].to_state = 2;
	transformation_function[2][5].marker = 0;
	transformation_function[2][5].direction = 1;
	
	//(q2,b) -> (q3,b',->)
	transformation_function[2][1].to_state = 3;
	transformation_function[2][1].marker = 4;
	transformation_function[2][1].direction = 1;
	
	//(q3,b) -> (q3,b,->)
	transformation_function[3][1].to_state = 3;
	transformation_function[3][1].marker = 0;
	transformation_function[3][1].direction = 1;
	
	//(q3,c') -> (q3,c',->)
	transformation_function[3][6].to_state = 3;
	transformation_function[3][6].marker = 0;
	transformation_function[3][6].direction = 1;
	
	//(q3,c) -> (q4,c',<-)
	transformation_function[3][2].to_state = 4;
	transformation_function[3][2].marker = 4;
	transformation_function[3][2].direction = -1;
	
	//(q3,d) -> (q-1,d,-) // we fail because there are more a's and b's and we need to check for c's
	transformation_function[3][3].to_state = -1;
	transformation_function[3][3].marker = 0;
	transformation_function[3][3].direction = 0;
	
	//go back to first a
	//(q4,c') -> (q4,c',<-)
	transformation_function[4][6].to_state = 4;
	transformation_function[4][6].marker = 0;
	transformation_function[4][6].direction = -1;
	//(q4,b) -> (q4,b,<-)
	transformation_function[4][1].to_state = 4;
	transformation_function[4][1].marker = 0;
	transformation_function[4][1].direction = -1;
	//(q4,b') -> (q4,b',<-)
	transformation_function[4][5].to_state = 4;
	transformation_function[4][5].marker = 0;
	transformation_function[4][5].direction = -1;
	//(q4,a) -> (q4,a,<-)
	transformation_function[4][0].to_state = 4;
	transformation_function[4][0].marker = 0;
	transformation_function[4][0].direction = -1;
	//(q4,a') -> (q1,a',->)
	transformation_function[4][4].to_state = 1;
	transformation_function[4][4].marker = 0;
	transformation_function[4][4].direction = 1;
	
	//we went back to the last a' and we get a(have transformation for this) or b'
	//if it's b', we go and check for a c'
	//(q1,b') -> (q5,b',->)
	transformation_function[1][5].to_state = 5;
	transformation_function[1][5].marker = 0;
	transformation_function[1][5].direction = 1;
	
	//(q5,b') -> (q5,b',->)
	transformation_function[5][5].to_state = 5;
	transformation_function[5][5].marker = 0;
	transformation_function[5][5].direction = 1;
	
	//
	//we have the same number of a and b so we're done (n==m)
	//
	//(q5,c') -> (q0,c',-)
	transformation_function[5][6].to_state = 0;
	transformation_function[5][6].marker = 0;
	transformation_function[5][6].direction = 0;
	
	//(q5,b) -> (q6,b',->)
	transformation_function[5][1].to_state = 6;
	transformation_function[5][1].marker = 4;
	transformation_function[5][1].direction = 1;
	
	//(q6,b) -> (q6,b,->)
	transformation_function[6][1].to_state = 6;
	transformation_function[6][1].marker = 0;
	transformation_function[6][1].direction = 1;
	
	//(q6,c') -> (q6,c',->)
	transformation_function[6][6].to_state = 6;
	transformation_function[6][6].marker = 0;
	transformation_function[6][6].direction = 1;
	
	//(q6,c) -> (q7,c',<-)
	transformation_function[6][2].to_state = 7;
	transformation_function[6][2].marker = 4;
	transformation_function[6][2].direction = -1;
	
	//(q7,c') -> (q7,c',<-)
	transformation_function[7][6].to_state = 7;
	transformation_function[7][6].marker = 0;
	transformation_function[7][6].direction = -1;
	
	//(q7,b) -> (q7,b,<-)
	transformation_function[7][1].to_state = 7;
	transformation_function[7][1].marker = 0;
	transformation_function[7][1].direction = -1;
	
	//(q7,b') -> (q5,b',->)
	transformation_function[7][5].to_state = 5;
	transformation_function[7][5].marker = 0;
	transformation_function[7][5].direction = 1;
	
	//(q5,c') -> (q5,c',->)
	transformation_function[5][6].to_state = 5;
	transformation_function[5][6].marker = 0;
	transformation_function[5][6].direction = 1;
	
	
	//we failed
	//(q5,c) -> (q-1,c,-)
	transformation_function[5][2].to_state = -1;
	transformation_function[5][2].marker = 0;
	transformation_function[5][2].direction = 0;
	
	//we have same number of b as c (m==p)
	//(q6,d) -> (q0,d,-)
	transformation_function[6][3].to_state = 0;
	transformation_function[6][3].marker = 0;
	transformation_function[6][3].direction = 0;
}

void init_tape(char *input)
{
	int lchar = strlen(input);
	strcpy(tape,input);
	//tape[lchar] = 'B';
	tape[lchar] = 'd';
	tape[lchar+1] = '\n';
}

int main()
{
	int T;
	char word[1024];
	freopen("tm.in","r",stdin);
	freopen("tm.out","w",stdout);
	scanf("%d",&T);
	//init_tape(word);
	//int i=0;
	int norm_sym = 0;
	int new_state;
	init_transformation_function();
	for(int wcount = 0;wcount<T;wcount++)
	{
		scanf("%s",word);
		init_tape(word);
		head = 0;
		state = 1;
		while((state > 0) && (tape[head] != '\n'))
		{
			norm_sym = tape[head] - 97;
			new_state = transformation_function[state][norm_sym].to_state;
			//printf("state:%d   ",state);
			//printf("to_state:%d   ",transformation_function[state][norm_sym].to_state);
		
			//printf("sym:%d   ",norm_sym);
			tape[head] += transformation_function[state][norm_sym].marker;
			//printf("marker:%d   ",transformation_function[state][norm_sym].marker);
		
			head += transformation_function[state][norm_sym].direction;
			//printf("direction:%d   ",transformation_function[state][norm_sym].direction);
			//printf("head:%d   ",head);
		
		
			//printf("\n%s",tape);
			state = new_state;
	//		i++;
			//printf("\n");
		}
		//printf("word:\n%s",word);
		if(state == 0)
			printf("DA\n");
		else
			printf("NU\n");
	}
	//cout<<"\nstate:"<<state;
	return 0;
}