題目:點擊打開鏈接
題意:給你一段火星文對應的英文,再給你幾句火星話,讓你翻譯成英文。
分析:先把火星文建成一顆字典樹,在翻譯的時候,查找每個單詞塊,看是否這個串在字典樹中能否找到,因爲在建樹的時候id存儲了對應單詞的英文,所以查找的時候返回id就可以,找不到就返回-1. 對於這題,如果簡單的做做,可以用map,很簡單。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=500005;
char word[N][11];
char c[11],s[3009];
struct node
{
int id;
node *next[26];
node()
{
id=-1;
memset(next,0,sizeof(next));
}
};
void Insert(node *rt,char *s,int id)
{
int i=0;
node *p=rt;
while(s[i]){
int k=s[i++]-'a';
if(p->next[k]==NULL)
p->next[k]=new node();
p=p->next[k];
}
p->id=id;
}
int Search(node *rt,char s[],int n)
{
int i=0;
node *p=rt;
while(n--){
int k=s[i++]-'a';
if(p->next[k]==NULL)return -1;
p=p->next[k];
//if(p->ok&&s[i])sta[top++]=i;
}
return p->id;
}
int main()
{
int n=0;
// freopen("f.txt","r",stdin);
node *rt=new node();
gets(c);
for(int i=0;;i++){
scanf("%s%s",word[i],c);
if(c[0]=='S')break;
Insert(rt,c,i);
}
getchar();
while(gets(s)){
if(s[0]=='E')break;
int n=strlen(s);
int pre=0;
for(int i=0;i<n;i++){
if(s[i]>='a'&&s[i]<='z')continue;
int id=Search(rt,s+pre,i-pre);
if(id!=-1){
//cout<<id<<' ';
printf("%s",word[id]);
}
else{
for(int k=pre;k<i;k++)
printf("%c",s[k]);
}
printf("%c",s[i]);
pre=i+1;
}
printf("\n");
}
return 0;
}
map。
#include<iostream>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,string>m;
int main()
{
//freopen("f.txt","r",stdin);
string s,s1,s2;
cin>>s;
while(cin>>s1>>s2){
if(s1[0]=='E')break;
m[s2]=s1;
}
getchar();
while(getline(cin,s1)){
if(s1[0]=='E')break;
int pre=0;
for(int i=0;i<s1.size();i++){
if(s1[i]>='a'&&s1[i]<='z')continue;
string s(s1,pre,i-pre);
if(m.count(s)){
cout<<m[s];
}
else{
cout<<s;
}
cout<<s1[i];
pre=i+1;
}
cout<<endl;
}
return 0;
}