hdu1075 What Are You Talking About

这题目真的彻底无语了,因为一个小错误,检查了半天,就是一个累加变量被我重复用了

悲剧呀,怪不得老是输出一些莫名其妙的东西

整体的话,这应该也算是基础的字典树吧,,就是读入数据有些技巧,嘿嘿,不过好像可以用map做哦

前面做过一道题,就是在一个串的末尾的节点处,标记一下,而这道题,在一个串的末尾处将该串对应 的英文插入

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	node* next[26];
	char str[10];
}*tree,t;
tree root;
char art[1010];
void insert(char *s1,char *s2)
{
	tree p=root,newnode;
	for(;*s2!='\0';s2++)
	{
		int i=*s2-'a';
		if(p->next[i]!=NULL)
			p=p->next[i];
		else 
		{
			newnode=(tree)malloc(sizeof(t));
			for(int j=0;j<26;j++)
		      newnode->next[j]=NULL;//就是这里,i跟j混用了,悲剧呀,查了好久都没查出来
	        strcpy(newnode->str,"");
			p->next[i]=newnode;
			p=newnode;
		}
	}
	strcpy(p->str,s1);
}
int find(char *s1)
{
	tree p=root;
	for(;*s1!='\0';s1++)
	{
		int i=*s1-'a';
		if(p->next[i]!=NULL)
			p=p->next[i];
		else return 0;
	}
	if(strcmp(p->str,"")!=0)//若在字典中,则输出
	{
			printf("%s",p->str);
			return 1;
	}
	else return 0;
}
int main()
{
	int i,n;
	char s1[10],s2[10],s[10];
	root=(tree)malloc(sizeof(t));
	for(i=0;i<26;i++)
		root->next[i]=NULL;
	strcpy(root->str,"");
	gets(s);
	while(scanf("%s %s",s1,s2)!=EOF)
	{
		if(strcmp(s1,"END")==0)
			break;
		insert(s1,s2);
	}
	getchar();
	while(gets(art))
	{
		if(strcmp(art,"END")==0)
			break;
		char ss[15]="";
		int k=0;
		for(i=0;i<strlen(art);i++)//这一步读入很有技巧
		{
			if(!(art[i]<='z'&&art[i]>='a'))
			{
				ss[k]=0;//这里也蛮关键的,相当于将字符串末尾赋结束标志
				int flag=find(ss);
				if(!flag)//如果字典中查不到,则直接输出
					printf("%s",ss);
				k=0;//记得要重新赋值为0
				printf("%c",art[i]);
			}
			else ss[k++]=art[i];//将除了标点符号之外的字母先单独保存,当遇到标点符号之类的就可以送入字典去查找了
		}
		printf("\n");
	}
	return 0;
}
原文地址:https://www.cnblogs.com/nanke/p/2044833.html