hdu 1075 What Are You Talking About 字典树 单词替换
2017-10-12 16:27
567 查看
题目大意:将给出的火星字符串翻译成英文字符串,每个单词有对应的英文单词,如果不存在对应的就输出原有的即可。
最简单的方法就是map一一对应后输出,也可以通过。
但是这种单次替换的问题,最好的方法就是用字典树。字段树末端保存这个单词对应的哪一个单词。
#include <iostream>
#include <cstdio>
#include <cstring>
#include<malloc.h>
using namespace std;
struct node
{
char *cc;//用来存最后一个单词
node *next[26];
int flag;//用来标记
node()//初始化
{
for (int i=0; i<26; i++)
{
next[i]=NULL;
}
flag=0;
}
};
node *p,*root=new node();
void insert(char *s,char *t)//对火星文进行建树,在最后一个字符下面存下对应的英文字符串
{
p=root;
for (int i=0; s[i]!='\0'; i++)
{
int k=s[i]-'a';
if (p->next[k]==NULL)
p->next[k]=new node();
p=p->next[k];
}
p->flag=1;//用来标记当前火星字符串的结尾有对应的英文字符串
p->cc=(char*)malloc((strlen(t)+1)*sizeof(char));//申请动态空间
strcpy(p->cc,t);//将对应字符串存下
}
void Search(char *s)
{
p=root;
if(strlen(s)==0)
return ;
for (int i=0; s[i]!='\0'; i++)
{
int k=s[i]-'a';
if (p->next[k]==NULL)
{
printf("%s",s);//把原有字母输出(寻找的字符串不存在的,也就是未全部找完)
return;
}
p=p->next[k];
}
if (p->flag)
printf ("%s",p->cc);//输出找到的对应的单词
else
printf ("%s",s);//特殊判断找不到的情况,把原有字母输出(全部找完仍没有对应的)
}
int main()
{
char str[15],ch1[3010],ch2[3010];
char ch[3010];
scanf("%s",&str);
while (~scanf("%s",&ch1))
{
if (strcmp(ch1,"END")!=0)
{
scanf("%s",&ch2);
insert(ch2,ch1);
}
else
break;
}
scanf("%s",&str);
getchar();
while (gets(ch1))
{
if (strcmp(ch1,"END")==0)
break;
int k=0;
// cout<<111111111<<endl;
for(int i=0; ch1[i]!='\0'; i++)
{
if(ch1[i]>'z'||ch1[i]<'a')//将需要判断的字符串分割成一小部分一小部分
{
//cout<<"333333"<<ch1[i]<<endl;
ch[k]='\0';//找到一个就断开
Search(ch);//寻找相应的对应单词
printf("%c",ch1[i]);//输出断点的字符
k=0;//覆盖已经找过的字符,从头一个个存下来
}
else
{
ch[k++]=ch1[i];// 将符合条件的字符存下来
}
}
printf("\n");
}
return 0;
}
最简单的方法就是map一一对应后输出,也可以通过。
但是这种单次替换的问题,最好的方法就是用字典树。字段树末端保存这个单词对应的哪一个单词。
#include <iostream>
#include <cstdio>
#include <cstring>
#include<malloc.h>
using namespace std;
struct node
{
char *cc;//用来存最后一个单词
node *next[26];
int flag;//用来标记
node()//初始化
{
for (int i=0; i<26; i++)
{
next[i]=NULL;
}
flag=0;
}
};
node *p,*root=new node();
void insert(char *s,char *t)//对火星文进行建树,在最后一个字符下面存下对应的英文字符串
{
p=root;
for (int i=0; s[i]!='\0'; i++)
{
int k=s[i]-'a';
if (p->next[k]==NULL)
p->next[k]=new node();
p=p->next[k];
}
p->flag=1;//用来标记当前火星字符串的结尾有对应的英文字符串
p->cc=(char*)malloc((strlen(t)+1)*sizeof(char));//申请动态空间
strcpy(p->cc,t);//将对应字符串存下
}
void Search(char *s)
{
p=root;
if(strlen(s)==0)
return ;
for (int i=0; s[i]!='\0'; i++)
{
int k=s[i]-'a';
if (p->next[k]==NULL)
{
printf("%s",s);//把原有字母输出(寻找的字符串不存在的,也就是未全部找完)
return;
}
p=p->next[k];
}
if (p->flag)
printf ("%s",p->cc);//输出找到的对应的单词
else
printf ("%s",s);//特殊判断找不到的情况,把原有字母输出(全部找完仍没有对应的)
}
int main()
{
char str[15],ch1[3010],ch2[3010];
char ch[3010];
scanf("%s",&str);
while (~scanf("%s",&ch1))
{
if (strcmp(ch1,"END")!=0)
{
scanf("%s",&ch2);
insert(ch2,ch1);
}
else
break;
}
scanf("%s",&str);
getchar();
while (gets(ch1))
{
if (strcmp(ch1,"END")==0)
break;
int k=0;
// cout<<111111111<<endl;
for(int i=0; ch1[i]!='\0'; i++)
{
if(ch1[i]>'z'||ch1[i]<'a')//将需要判断的字符串分割成一小部分一小部分
{
//cout<<"333333"<<ch1[i]<<endl;
ch[k]='\0';//找到一个就断开
Search(ch);//寻找相应的对应单词
printf("%c",ch1[i]);//输出断点的字符
k=0;//覆盖已经找过的字符,从头一个个存下来
}
else
{
ch[k++]=ch1[i];// 将符合条件的字符存下来
}
}
printf("\n");
}
return 0;
}
相关文章推荐
- HDU 1075 What Are You Talking About (字典树)
- hdu 1075 What Are You Talking About 字典树 或 stl map
- hdu 1075 What Are You Talking About 字典树 trie
- hdu 1075 What Are You Talking About(字典树)
- hdu 1075 What Are You Talking About(给你字典,让你翻译句子,字典中查不到的单词不用翻译)
- hdu 1075 What Are You Talking About(字典树)
- HDU - 1075 What Are You Talking About(字典树)
- hdu 1075 What Are You Talking About 字典树(静态版)
- hdu 1075 What Are You Talking About (字典树)
- HDU - 1075 - What Are You Talking About(字典树)
- hdu 1075 What Are You Talking About【字典树】
- hdu 1075 What Are You Talking About (字典树)
- hdu 1075 What Are You Talking About 字典树
- HDU 1075 What Are You Talking About(字典树)
- HDU-1075 What Are You Talking About 字典树
- hdu 1075-What Are You Talking About(Map&&字典树)
- HDU 1075.What Are You Talking About【Map水题(字典树)】【5月25】
- hdu-1075-What Are You Talking About-(字典树)
- HDU ACM 1075 What Are You Talking About(字典树)
- HDU 1075 What Are You Talking About(字典树)