您的位置:首页 > 其它

HDU/HDOJ 1075 What Are You Talking About(字典树|STL map)

2013-04-25 02:58 399 查看
原文地址:http://www.wutianqi.com/?p=2467

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1075

这题用字典树Trie做很麻烦,用STL map要简单多了。

字典树的讲解;

http://www.wutianqi.com/?p=1359

这个是网上一位朋友的代码,分别是用字典树和map做的:

// 字典树
#include<iostream>
#include<string>
using namespace std;
int i;
struct dictree
{
dictree *child[26];
char engWord[11];
dictree()//初始化非常的有必要
{
for(i=0;i<26;i++)
child[i] = NULL;
engWord[0]='\0';
}
};
dictree root;
void insert(char eng[],char mar[])//构建字典树
{
dictree *now = &root;
char *tmp = mar;
while(*tmp)
{
if(now->child[*tmp-'a']==NULL)
now->child[*tmp-'a'] = new dictree;
now = now->child[*tmp-'a'];
tmp++;
}
strcpy(now->engWord,eng);
}

char *find(char ch[])//查找单词
{
dictree *p = &root;
int k=0;
while(1)
{
if(ch[k]=='\0' || p->child[ch[k]-'a']==NULL)
break;
p = p->child[ch[k]-'a'];
k++;
}
if(ch[k]=='\0' && strcmp(p->engWord,"")!=0)
return p->engWord;
return NULL;
}

int main()
{
char a[11],b[11];
scanf("%s",a);//"START"
while(scanf("%s",a) && strcmp(a,"END")!=0 )
{
scanf("%s",b);
insert(a,b);
}
scanf("%s",a);//"START"
getchar();//吃回车
char tmp[3002];
while(1)
{
gets(tmp);//用这个比getline()强
if(strcmp(tmp,"END") == 0 )
break;
int i,len,k=0;
len = strlen(tmp);
tmp[len]=' ';//多加一个' ',输出的时候注意
tmp[++len]='\0';
char tp[3002];
for(i=0;i<len;i++)
{
if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母
{
tp[k]='\0';
char *temp = find(tp);//查找是否有对应的engWord
if(temp)//存在这个单词
printf("%s",temp);
else
printf("%s",tp);//可以用cout<<tp;//不可以用puts(tp);用puts有换行
k=0;
if(i!=len-1)//最后有一个' '是多余的
cout<<tmp[i];//输出非小写字母字符
}
else //小写字母
tp[k++]=tmp[i];
}
cout<<endl;
}
return 0;
}


STL map:

// STL map
#include<iostream>
#include<string>
#include<map>
using namespace std;
map<string,string>M;
int main()
{
string a,b;
cin>>a;//"START"
while(cin>>a && a!="END")
{
cin>>b;
M[b] = a;
}
cin>>a;//"START"
getchar();//吃回车
char tmp[3005];
while(1)
{
gets(tmp);//用这个比getline()强
if(strcmp(tmp,"END") == 0 )
break;
int i,len;
len = strlen(tmp);
b = "";
for(i=0;i<len;i++)
{
if(!(tmp[i]>='a' && tmp[i]<='z'))//非小写字母
{
if(M[b]!="")//存在这个单词
cout<<M[b];
else
cout<<b;
b="";
cout<<tmp[i];
}
else //小写字母
b+=tmp[i];
}
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: