HDU1075 不錯的字典樹題

2021-08-14 23:47:58 字數 1913 閱讀 9131

題意:

給你多條英語對應火星文,然後在下面輸入一堆火星文,要你翻譯成英文,如果一些火星文沒有對應的英文的話就輸出原火星文就可以了,有就輸出英文。

題解:

一看到這道題就想到了map容器,奈何挺久沒用過了,導致我很難下手,還是去看了別人怎麼寫的記憶才慢慢復甦,怎麼說呢,stl是個神器,但是我用不習慣。。。orz,既然這道題是一道字典樹的題目的話,咱們就用字典樹的做法去做吧。

怎麼做呢?把輸入的英文存放起來,而火星文則存進字典樹中,在每個火星文最後的樹節點中標記編號,然後find函式查詢這個火星文是否有對應的英文,有的話就輸出英文,沒有就輸出原文。這道題就過了,但是有點坑爹的是,要稍微判斷一下沒有火星文的情況,另外還有一點坑爹的就是你陣列要開到100萬,不然會超時的,這一度讓我懷疑是不是我字典樹寫錯了。

還有一種省略了陣列的寫法,在我自己的做法的下面,大家可以去看看。

字典樹做法:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1000000+7;//這坑爹的玩意要開100w..我開3000超時導致我一度以為我的字典樹寫錯了。

struct node

}*root;

int tot=0;

char s[maxn][15];

void insert(char *s)

r->cnt=tot++;

}int find(char *s)

return r->cnt;

}int main()

scanf("%s",c);

getchar();

while(gets(c))

x[m]='\0';

m=0;

if(find(x)!=-1)

printf("%s",s[find(x)]);

else

printf("%s",x);

printf("%c",c[i]);

}printf("\n");

}}

還有一種不用陣列更好的寫法:

#include

#include

#include

using

namespace

std;

struct node

}*root;

char c[15];

void insert(char *s)

r->cnt=1;

strcpy(r->s,c);

}char *find(char *s)

if(r->cnt)

return r->s;

else

return s;

} void del(node *head)

int main()

scanf("%s",c);

getchar();

char str[3007];

while(gets(str))

}printf("\n");

}del(root);

}

map容器的寫法:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=3000+7;

mapmp;

char s[maxn];

int main()

cin>>a;

getchar();//要加上這個吸收換行符。

while(1)

HDU 1075 字典樹模板

題目傳送門 伊格那丟很幸運,昨天他遇見了乙個火星人。但是他不懂火星人使用的語言。火星人給了他一本關於火星的歷史書和一本字典。現在伊格內修斯想把這本歷史書譯成英語。你能幫助他嗎?輸入問題只有乙個測試用例,測試用例由兩個部分組成,字典部分和書籍部分。字典部分從一行開始包含乙個字串 start 這個字串應...

hdu 1075 (字典樹對映)

問題 輸入一段英文,對照給的單詞的對映,輸出對映後的字串 yy 典型的字典樹問題,先處理好對映表,在一對映單詞結尾處記錄與之對應的單詞,後面字串處理一下,單個單詞進行查,找到後輸出,沒有輸出原始詞 剛開始交re越界,不解,覺得是指標問題,但找不出錯處 後來找到個神奇資料後改過就a了 start do...

hdu4415 不錯的想法題

題意 乙個人他有一定的血,有一些怪物,他去殺怪物,有的怪物殺死他後還可以在不費自己血的情況下任意殺死一些怪物,問你他最多殺死多少怪物,在最多殺怪前提下最好用多少血,大體題意是這樣 思路 首先我們把怪物分成兩個集合,a乙個是殺死他後可以免費殺死其他人的,b另乙個是殺死他後不能免費殺死其他人的,分析下我...