-------千萬別讓不開心的事影響了自己正常的生活,今天遇到了尷尬的事情,鬱悶了一晚上沒看書,就只是快要熄燈了做完我的每日一水題
《What Are You Talking About》看起來感覺好複雜的樣子,一看Time Limit和Memory Limit果斷放心做了。wa了幾次,最後在一通亂改中AC現在還是不太明白希望有看到的幫忙分析下(標註在了代碼中)。
題意:第一個START 和 END 之間的每行兩個字符串,意思是後面的(火星的)單詞可以翻譯成前面的(地球的)單詞。第二個START 和 END 之間的每行一個長字符串代表火星的文章,讓你翻譯成地球文輸出。
思路:把每個火星單詞放入字典樹,每個火星單詞的尾節點存上對應的地球單詞作爲最後查找用,然後就是翻譯階段,把所有連續的小寫字母組成的字符串存在一個字符數組中查找該單詞是否有對應的地球單詞,有則輸出翻譯結果,否則原樣輸出,剩下的除了小寫字母之外的字符全都原樣輸出。
字典樹的意思就是先給一個根節點,然後順着這條根節點往下連接兒子節點的那條邊作爲單詞的一個字母,如果存在這個字母就下去找那個兒子節點,然後同理找下一個字母。不存在這個字母的話,根節點就再生一個兒子,然後繼續不斷地生..查找同理,字母不存在就說明沒這個單詞
本題代碼
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <map>
#include <algorithm>
using namespace std;
char s[12], s2[12];
char val[1000000][26];
int ch[1000000][26];
int tmp;
void insert(char *a, char *b)
{
int rt = 0, x;
for (int i = 0; a[i]; i++)
{
x = a[i] - 'a';
if (ch[rt][x] == 0)
{
strcpy(val[tmp], "");
ch[rt][x] = tmp++;
}
rt = ch[rt][x];
}
strcpy(val[rt], b);
}
void find(char *ss)
{
int rt = 0, x;
for (int i = 0; ss[i]; i++)
{
x = ss[i] - 'a';
if (ch[rt][x] == 0)
{
printf("%s", ss);
return ;
}
rt = ch[rt][x];
}
if (strcmp(val[rt], "") != 0)//我不解的是爲什麼這裏要判斷下val[rt]的內容才能輸出,而不是直接輸出val[rt];
printf("%s", val[rt]);
else
printf("%s", ss);
}
int main()
{
tmp = 1;
strcpy(val[0], "");
memset(ch[0], 0, sizeof(ch[0]));
while (scanf("%s", s) != EOF)
{
if (strcmp(s, "START") == 0) continue;
else if (strcmp(s, "END") == 0) break;
else
{
scanf("%s", s2);
insert(s2, s);
}
}
getchar();
char str[3001];
while(gets(str))
{
if(strcmp(str,"START") == 0) continue;
else if(strcmp(str,"END") == 0) break;
else
{
int tt = 0, t = 0;
for(int i = 0; str[i]; i++)
{
if(str[i] >= 'a' && str[i] <= 'z')
{
if(tt == 0)
tt=1;
s[t++] = str[i];
}
else
{
if(tt == 1)
{
tt = 0;
s[t] = 0;
t = 0;
find(s);
}
printf("%c", str[i]);
}
}
if(tt == 1)
{
s[t] = 0;
find(s);
}
}
printf("\n");
}
return 0;
}