/*
*****************************************************
* 题目: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;
}
HDU 1075
最新推荐文章于 2020-03-20 17:30:02 发布