日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uva 10391 Compound Words

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uva 10391 Compound Words 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

哈希

題意簡短:單case,輸入一列單詞即一個字典,已經按字典序排好輸入,上限為120000,然后要你找一些單詞,這種單詞可以分為兩部分,兩部分都是字典里面的單詞,按字典序輸出這種單詞

很裸的哈希,對于每個單詞,將其分成兩部分,一共有len中分法,然后去查找是否都在字典中,如果都在字典中就輸出(因為輸入已經按字典序排好,掃描時直接掃下來就可以了,找到合適的就輸出)

問題的關鍵就轉變為,給你一個單詞,怎么判斷這個單詞是不是在字典中,用哈希就可以快速判斷到。輸入時隨便將每個單詞都用哈希函數映射掉,每得到要查詢的單詞也直接映射過去查找

處理沖突的方法是鏈表(靜態鏈表數組模擬)

用了BKDHash函數在處理字符串的映射

?

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; }

?

?

自己瞎比比寫的一個字符串哈希,沖突死了,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; }

?

總結

以上是生活随笔為你收集整理的uva 10391 Compound Words的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。