HDU 1075

/*
 *****************************************************
 * 题目:HDU 1075									 
 * 地址:http://acm.hdu.edu.cn/statistic.php?pid=1075
 * 状态:AC
 *****************************************************
 * Exe.Time: 421 MS
 * Exe.Memory: 59868 K
 * Code.Len: 1768 B
 *****************************************************
 */

#include <stdio.h>
#include <string.h>
#include <ctype.h>

struct trieNode{			//字典树结点 
	bool is_over;  			//标记当前结点是否是最后一个字母 
	char english[13];		//如果是最后一个字母,则把对应的英文单词存入当前结点 
	trieNode * child[26];	//本题中只有26个小写字母 
	trieNode(){				//构造函数,初始化结构体中的数据 
		is_over = false;
		memset(english, 0, sizeof(english));
		memset(child, 0, sizeof(child));
	} 	
}* root = new trieNode();	//创建全局头结点 

void add(char * keyword, char * english)	//往字典树中加入数据 
{
	trieNode * next = root;
	while(*keyword)
	{
		if(next->child[*keyword - 'a'] == NULL)
		{
			next->child[*keyword - 'a'] = new trieNode();
		}
		next = next->child[*keyword - 'a'];
		keyword++;
	}
	next->is_over = true;
	strcpy(next->english, english);			//strcpy(to, from):复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to。
	//next->english = english;
}

bool query(char * str)
{	//返回值标记是否找到,如果找到,直接打印对应英文并返回true,否则返回false 
	trieNode * next = root;
	while(*str)
	{
		if(next->child[*str-'a'] != NULL)
			next = next->child[*str-'a'];
		else
			return false;  	//如果这边都没扫完,说明树中没有此字,直接返回false 

		str++;
	}
	if(next->is_over)
	{
		printf("%s", next->english);	//如果前面扫描完,但是发现并不是结束,说明这是某个火星词的前缀,同样返回false, 
		return true;					// 否则打印对应翻译并返回true
	}

	return false;
}

int get_first_word(char * to, char * from)
{	//此函数用来从读取的一长串字符串中取出第一个单词(遇到标点或空格就停)
	//返回单词的长度,方便下面指针前移 
	int i;
	for(i=0;  ;i++)
	{
		if(isalpha(*(from+i)))
		{	//如果是字母,复制到to中 
			*(to+i) = *(from+i);
		}	
		else
			break;
	}
	*(to+i) = '\0';		//不要忘了在to的最后加上空字符 
	return i;
}

char book[3005];

int main(void)
{
	freopen("E:\\input.txt", "r", stdin);
	char Martian[13], English[13];
	scanf("%s", Martian); //clear START
	while(scanf("%s%s", English, Martian), strcmp(English, "END")!=0)
	{
		add(Martian, English);
	}
	getchar();		//这里清掉第二个"START"结尾的一个回车符 
	while(gets(book), strcmp(book, "END")!=0)
	{
		char * ptr_book = book;			//直接操作book不行,因为book是个指针常量,不是变量! 
		while(*ptr_book)
		{
			ptr_book += get_first_word(Martian, ptr_book);	//指针往前移 
			if(query(Martian) == false)						//配合query()函数进行打印输出 
			{
				printf("%s", Martian);
			}
			while(!isalpha(*ptr_book))		//这里用来把标点和空格等非字母字符打印出来 
			{
				if(*ptr_book == NULL)
					break;
				printf("%c", *ptr_book);
				ptr_book++;
			}
		}
		puts("");
	}
	return 0;
}

你可能感兴趣的:(c,null,query)