HDU 1880 魔咒詞典(字串雜湊)

2022-05-15 17:17:25 字數 1423 閱讀 6156

題目鏈結

哈利波特在魔法學校的必修課之一就是學習魔咒。據說魔法世界有100000種不同的魔咒,哈利很難全部記住,但是為了對抗強敵,他必須在危急時刻能夠呼叫任何乙個需要的魔咒,所以他需要你的幫助。

給你一部魔咒詞典。當哈利聽到乙個魔咒時,你的程式必須告訴他那個魔咒的功能;當哈利需要某個功能但不知道該用什麼魔咒時,你的程式要替他找到相應的魔咒。如果他要的魔咒不在詞典中,就輸出「what?」

首先列出詞典中不超過100000條不同的魔咒詞條,每條格式為:

[魔咒] 對應功能

其中「魔咒」和「對應功能」分別為長度不超過20和80的字串,字串中保證不包含字元「[」和「]」,且「]」和後面的字串之間有且僅有乙個空格。詞典最後一行以「@end@」結束,這一行不屬於詞典中的詞條。

詞典之後的一行包含正整數n(<=1000),隨後是n個測試用例。每個測試用例佔一行,或者給出「[魔咒]」,或者給出「對應功能」。

每個測試用例的輸出佔一行,輸出魔咒對應的功能,或者功能對應的魔咒。如果魔咒不在詞典中,就輸出「what?」

題目大意:略。

思路:字串雜湊。

ps:由於這個題目的所有字串存起來已經有20+mb,對於這個只有32mb記憶體限制的題目,用map< stirng, string > 只會mle,於是只能手寫hash。

ps2:主要是為了測試一下pb_ds裡的hash。使用方法可以參考wc2015的**《c++的pb_ds庫在oi中的應用》。

#include #include #include #include #include #include typedef long long ll;

const int maxn = 108;

std::mapdict_forward, dict_backward;

std::string a[100000], b[100000];

char str1[maxn], str2[maxn];

std::string tmp1, tmp2;

int n;

int gethash(const std::string &str)

void myfind(const std::string &s, std::map&dict, std::string arr)

void myfind(const std::string &s, __gnu_pbds::cc_hash_table&dict, std::string arr)

void myfind(const std::string &s, __gnu_pbds::gp_hash_table&dict, std::string arr) else

}int main()

scanf("%d", &n); getchar();

for(int i = 0; i < n; ++i) else

}}

hdu1880(魔咒詞典)

1.下面是二分查詢 ac include include include define max 100005 typedef struct node node node mag1 max node mag2 max int cmp1 const void a,const void b int cmp...

魔咒詞典 HDU 1880

感覺這題巨毒瘤,讀入字串方面調了好久才避免了讀入空白字元。思路就是對每條資訊的魔咒和功能的記錄在s1和s2串裡,並在ihash陣列裡通過資訊的編號 cnt 確定存放的列,將魔咒 魔咒的hash值存在第一行 或功能 功能的hash值存在第2行 的hash值存入。然後輸入乙個要查詢的字串,就先求出其ha...

HDU 1880魔咒詞典

problem description 哈利波特在魔法學校的必修課之一就是學習魔咒。據說魔法世界有100000種不同的魔咒,哈利很難全部記住,但是為了對抗強敵,他必須在危急時刻能夠呼叫任何乙個需要的魔咒,所以他需要你的幫助。給你一部魔咒詞典。當哈利聽到乙個魔咒時,你的程式必須告訴他那個魔咒的功能 當...