uva 10391 Compound Words
生活随笔
收集整理的這篇文章主要介紹了
uva 10391 Compound Words
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
哈希
題意簡短:單case,輸入一列單詞即一個(gè)字典,已經(jīng)按字典序排好輸入,上限為120000,然后要你找一些單詞,這種單詞可以分為兩部分,兩部分都是字典里面的單詞,按字典序輸出這種單詞
很裸的哈希,對(duì)于每個(gè)單詞,將其分成兩部分,一共有l(wèi)en中分法,然后去查找是否都在字典中,如果都在字典中就輸出(因?yàn)檩斎胍呀?jīng)按字典序排好,掃描時(shí)直接掃下來就可以了,找到合適的就輸出)
問題的關(guān)鍵就轉(zhuǎn)變?yōu)?#xff0c;給你一個(gè)單詞,怎么判斷這個(gè)單詞是不是在字典中,用哈希就可以快速判斷到。輸入時(shí)隨便將每個(gè)單詞都用哈希函數(shù)映射掉,每得到要查詢的單詞也直接映射過去查找
處理沖突的方法是鏈表(靜態(tài)鏈表數(shù)組模擬)
用了BKDHash函數(shù)在處理字符串的映射
?
BKDHash,40ms
#include <cstdio> #include <cstring> #define N 120000 #define LEN 110 #define P 0x7fffffffint n,tot; char word[N+10][LEN]; int head[N+10]; struct list {int n;int next; }e[N+10];void add(unsigned int index ,int m) {e[tot].n = m;e[tot].next = head[index];head[index] = tot++; }unsigned int BKDHash(char *str) {unsigned int seed = 131;unsigned int hash = 0;int len = strlen(str);for(int i=0; i<len; i++)hash = hash * seed + str[i];return (hash & P) % N; }int find(char *str) {unsigned int index = BKDHash(str);for(int k=head[index]; k!=-1; k=e[k].next){int m = e[k].n;if(!strcmp(word[m] , str))return k;}return -1; }int main() {n = tot = 0;memset(head,-1,sizeof(head));while(scanf("%s",word[n])!=EOF){unsigned int index = BKDHash(word[n]);add(index , n);n++;}for(int i=0; i<n; i++){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j<len-1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++)str1[k] = word[i][kk];str1[k] = '\0';for(k=0,kk=j+1; kk<len; k++,kk++)str2[k] = word[i][kk];str2[k] = '\0';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s\n",word[i]);break;}}}return 0; }?
?
自己瞎比比寫的一個(gè)字符串哈希,沖突死了,200ms
#include <cstdio> #include <cstring> #define N 120000 #define LEN 110int n,tot; char word[N+10][LEN]; int head[N+10]; struct list {int n;int next; }e[N+10];void add(int index ,int m) {e[tot].n = m;e[tot].next = head[index];head[index] = tot++; }int Hash(int m) {int len = strlen(word[m]);int sum = 0;for(int i=0; i<len ; i++)sum += (word[m][i] - 'a')*i;return sum%N; }int find(char *str) {int len = strlen(str);int sum = 0;for(int i=0; i<len ;i++)sum += (str[i] - 'a')*i;int index = sum%N;for(int k=head[index]; k!=-1; k=e[k].next){int m = e[k].n;if(!strcmp(word[m] , str))return k;}return -1; }int main() {n = tot = 0;memset(head,-1,sizeof(head));while(scanf("%s",word[n])!=EOF){int index = Hash(n);add(index , n);n++;}for(int i=0; i<n; i++){char str1[LEN] , str2[LEN];int len = strlen(word[i]);for(int j=0; j<len-1; j++){int k,kk;for(k=0,kk=0; kk<=j; k++,kk++) str1[k] = word[i][kk];str1[k] = '\0';for(k=0,kk=j+1; kk<len; k++,kk++) str2[k] = word[i][kk];str2[k] = '\0';int ok[2];ok[0] = find(str1);ok[1] = find(str2);if(ok[0] != -1 && ok[1] != -1){printf("%s\n",word[i]);break;}}}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的uva 10391 Compound Words的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Crontab 使用(转)
- 下一篇: 在别人那看到的很不错的ext.net的基