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;
}

浙公网安备 33010602011771号