题意很简单 给你一个火星人的语言和地球人语言单词对照表,翻译火星人的语言。
虽然提前知道这题是字典树,但是看了一下题目,还是觉得如果不知情的话也会想去考虑自点数,因为太明显了。。给一个其他语言的单词和已知语言的单词对照表,完全就是字符匹配。。。
很简单,先把火星语插入的字典树,同时设置一个 flag 数组,必须保证整个单词都出现过才能 return rt,之后就是开一个下表数组,来记录这个单词出现的位置,然后在主语句中翻译时,如果不是空格就去对这串字符进行字典树搜索,没有发现对应的就输出源语句,否则输出对应位置的翻译语句。‘
做了几天的网络流。。稍微做到字典树版子题放松下。。。。
以下是 AC 代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e7+5;
int tree[maxn][30];
int flag[maxn];
int pos[maxn];
int tot;
int insert_(char *s)
{
int len = strlen(s);
int rt = 0;
for(int i=0;i<len;i++)
{
int id = s[i] - 'a';
if(!tree[rt][id])
tree[rt][id] = ++tot;
rt = tree[rt][id];
}
flag[rt] = true;
return rt;
}
int find_(char *s)
{
int len = strlen(s);
int rt = 0;
for(int i=0;i<len;i++)
{
int id = s[i] - 'a';
if(!tree[rt][id])
return -1;
rt = tree[rt][id];
}
if(flag[rt])
return rt;
else
return -1;
}
char ss[maxn][20];
char tmp[maxn];
int main()
{
int cnt = 0;
scanf("%s",tmp);
while(~scanf("%s",ss[cnt]))
{
if(ss[cnt][0] == 'E')
{
scanf("%s",tmp);
break;
}
scanf("%s",tmp);
pos[insert_(tmp)] = cnt;
cnt++;
}
getchar();
while(gets(tmp))
{
if(tmp[0]=='E') break;
int len=strlen(tmp);
char str[12];
int cnt;
for(int i=0;i<len;i++)
{
if(tmp[i]>='a'&&tmp[i]<='z'&&i<len)
{
cnt=0;
while(tmp[i]>='a'&&tmp[i]<='z')
{
str[cnt++] = tmp[i++];
}
str[cnt]='\0';
int pp=find_(str);
if(pp!=-1)
printf("%s",ss[pos[find_(str)]]);
else
printf("%s",str);
printf("%c",tmp[i]);
}
else
printf("%c",tmp[i]);
}
printf("\n");
}
return 0;
}