題目在
其實在面試中雜湊表是經常被問到的乙個題目,不過實戰程式設計中運用的卻很少,因為很少有效率瓶頸。
這個題目就一道典型的可以用雜湊表可以加速的題目。
題目大意:每片雪花有 6 個角長度的值,對於不同的雪花而言,這些值可能被反轉,並且開頭的長度未必是一致的
例如 1 2 3 4 5 6和 4 3 2 1 6 5,雖然他們表面上不同,但是經過反轉和偏移以後,就是相同的雪花。
在輸入資料中如果有相同的雪花,則輸出yes,否則輸出no。
這個題目為什麼適合用雜湊表呢,個人覺得主要乙個原因是資料不好排序,因為六片花瓣順序被打亂了,如果資料不能有效的排序,自然就不能有效的檢索。
但是這些資料雖然 卻可以比較容易找到乙個雜湊函式,將 被打亂的相同資料 對映到同乙個雜湊值上。 然後在針對小規模的資料做檢索,能很高的提高效率。
這裡我們採用linking的方式來處理衝突。
另外關於雜湊函式的選擇 這裡使用 將所有資料加起來然後求餘數的方法來做,對於函式函式的研究,可能有更好的雜湊方法~ 不過這個題目這個做法足夠了
source code
problem: 3349 user: hopeztm
memory: 6776k time: 1297ms
language: c++ result: accepted
source code
#include #include const int prime=999983;
struct snowflake
};struct entry
};entry hashdata[prime + 1];
int gethashcode(const snowflake &flake)
return s;
}bool flakesame(const snowflake &flake1,const snowflake &flake2)
; memcpy(v, flake1.v, sizeof(flake1.v));
memcpy(v+6, flake1.v, sizeof(flake1.v));
int i,j,k;
for(i = 0; i < 6; i++)
}if( k == 6)
}//reverse
for( i = 0, j = 11; i < 6; i++, j--)
for(i = 0; i < 6; i++)
}if( k == 6)
}return false;
}bool insertintohash(snowflake &flake)
else
previous = p;
p = p->next;
} previous->next = &flake;
return true; }}
snowflake snowflakes[100001];
int nflakes;
int main()
}} if(duplicate)
else
}return 0;
}
poj1042 黑書第一道貪心題
題意就不說了,主要講講思路以及注意的地方。思路 是按黑書上給出的思路編的,主要是貪心 列舉。因為每個池塘只能走一次,可以列舉前1,2,3,n個池塘之間所能釣的最大魚數。我們可以將路程一次性處理完畢,這樣就可以瞬移.每次瞬移到魚最多的池塘釣魚就好。有點遺憾,他們說可以用dp做,想了許久,沒想明白dp怎...
pwn題解第一道
今天聽說了乙個 pwnable.kr。很適合初學者,就試著做了一道題目。第一道題目,按照網頁上給的鏈結,使用putty鏈結工具聯入。輸入ls命令檢視檔案內容。很開心的看到了flag檔案,於是直接開啟,果然不出所料,我是沒有許可權開啟的。然後檢視了一下fd.c的 include include inc...
課堂第一道題
includevoid funstr char str1 main void funstr char str1 printf n printf s hello world hello world hwhello world hello world process exited after 4.466...