1. 程式人生 > >PTA 7-17 字串關鍵字的雜湊對映

PTA 7-17 字串關鍵字的雜湊對映

給定一系列由大寫英文字母組成的字串關鍵字和素數P,用移位法定義的雜湊函式(將關鍵字Key中的最後3個字元對映為整數,每個字元佔5位;再用除留餘數法將整數對映到長度為P的散列表中。例如將字串AZDEG插入長度為1009的散列表中,我們首先將26個大寫英文字母順序對映到整數0~25;再通過移位將其對映為3;然後根據表長得到,即是該字串的雜湊對映位置。

發生衝突時請用平方探測法解決。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int maxn = 1e6;
bool vis[maxn];
string s;
int n, p;
map<string, int> m;
int main() {
    scanf("%d %d", &n, &p);
    memset(vis, false, sizeof(vis));
    for (int i = 1; i <= n; i++) {
        cin >> s;
        int len = s.size();
        int x = 0;
        if (len == 1) x = (s[0]-'A');
        else if (len == 2) x = 32*(s[0]-'A')+(s[1]-'A');
        else  {
            for (int j = 3; j >= 1; j--) {
                int t = len - j;
                x = x * 32 + s[t] - 'A';
            }
        }
        x = x % p;
        if (m[s] || !vis[x]) {
            m[s] = x;
            vis[x] = true;
            cout << x;
        }
        else {
            int y;
            for (int j = 1; j*j < maxn; j++) {
                y = (x+j*j) % p;
                if (!vis[y]) {
                    vis[y] = true;
                    m[s] = y;
                    printf("%d", y);
                    break;
                }
                y = (x-j*j+p) % p;
                if (!vis[y]) {
                    vis[y] = true;
                    m[s] = y;
                    printf("%d", y);
                    break;
                }
            }
        }
        if (i < n) cout << " ";
        else printf("\n");
    }
    return 0;
}


相關推薦

PTA 7-17 字串關鍵字對映

給定一系列由大寫英文字母組成的字串關鍵字和素數P,用移位法定義的雜湊函式(將關鍵字Key中的最後3個字元對映為整數,每個字元佔5位;再用除留餘數法將整數對映到長度為P的散列表中。例如將字串AZDEG

PTA 7-42 整型關鍵字對映(手寫表的線性探測法)

本題考點: 整型雜湊表的線性探測法 給定一系列整型關鍵字和素數P,用除留餘數法定義的雜湊函式將關鍵字對映到長度為P的散列表中。用線性探測法解決衝突。 輸入格式: 輸入第一行首先給出兩個正整數N(≤1000)和P(≥N的最小素數),分別為待插入的關鍵字總數、以及散列表的長度。第二行給出N個整型關鍵字。數字

7-11 整型關鍵字對映 (25 分)

給定一系列整型關鍵字和素數P,用除留餘數法定義的雜湊函式將關鍵字對映到長度為P的散列表中。用線性探測法解決衝突。 輸入格式: 輸入第一行首先給出兩個正整數N(≤1000)和P(≥N的最小素數),分別為待插入的關鍵字總數、以及散列表的長度。第二行給出N個整型關鍵字。數字間以空格分隔。 輸出

字串關鍵字對映(25 分)

這個題目,資料結構的課本上是有的,當你發生衝突的時候,是可以用平方探測法解決的  這個題目就是需要注意一下,當你需要減的時候,需要防止一下負數取模的 給定一系列由大寫英文字母組成的字串關鍵字和素數P,用移位法定義的雜湊函式(將關鍵字Key中的最後3個字元對映為整數,每個

【LeetCode】 705. 706. 設計對映\集合

1.題目 705: 不使用任何內建的雜湊表庫設計一個雜湊集合 具體地說,你的設計應該包含以下的功能 add(value):向雜湊集合中插入一個值。 contains(value) :返回雜湊集合中是否存在這個值。 remove(value):將給定值從雜湊集合中刪除。如果

leetcode 706. 設計對映(python)

不使用任何內建的雜湊表庫設計一個雜湊對映 具體地說,你的設計應該包含以下的功能 put(key, value):向雜湊對映中插入(鍵,值)的數值對。如果鍵對應的值已經存在,更新這個值。 get(key):返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回-1。 remov

Leetcode706.Design HashMap設計對映

不使用任何內建的雜湊表庫設計一個雜湊對映 具體地說,你的設計應該包含以下的功能 put(key, value):向雜湊對映中插入(鍵,值)的數值對。如果鍵對應的值已經存在,更新這個值。 get(key):返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回-1。 rem

Redis記憶體資料庫命令大全——字串

個人原創,簡約實戰無廢話,歡迎大家轉載,不足之處期待您在留言處指出,謝謝! 在window上將redis安裝到服務中,redis-server --service-install  redis.windows-service.conf 一 字串型別鍵值操作命令 2 glob

redis 系列9 物件型別(字串,列表,集合,有序集合)與資料結構關係

原文: redis 系列9 物件型別(字串,雜湊,列表,集合,有序集合)與資料結構關係 一.概述   在前面章節中,主要了解了 Redis用到的主要資料結構,包括:簡單動態字串、連結串列(雙端連結串列)、字典、跳躍表、 整數集合、壓縮列表(後面再瞭解)。Redis沒有直接使用這些資料結構來實現鍵

Design HashMap 設計對映

不使用任何內建的雜湊表庫設計一個雜湊對映 具體地說,你的設計應該包含以下的功能 put(key, value):向雜湊對映中插入(鍵,值)的數值對。如果鍵對應的值已經存在,更新這個值。 get(key):返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回-1。 re

985F Isomorphic Strings(字串Hash

F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard outpu

LeetCode 706.設計對映(Design HashMap)

不使用任何內建的雜湊表庫設計一個雜湊對映  具體地說,你的設計應該包含以下的功能 put(key, value):向雜湊對映中插入(鍵,值)的數值對。如果鍵對應的值已經存在,更新這個值。 get(key):返回給定的鍵所對應的值,如果對映中不包含這個鍵,返回-1。

java 弱對映表WeakHashMap原理

弱雜湊對映表的原理其實很好理解,首先我們要知道HashMap的原理。如果我們將一個物件a以及他的引用A作為一個key值關聯某個Value值後put入HashMap中,那麼這個a物件的引用不僅僅有A,而且有一個HashMap中持有的引用,一共兩個引用。WeakHa

LeetCode 706:Design HashMap 實現一個簡單的對映

題目描述: Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these function

一個字串函式

雜湊函式一直對我來說都是比較神祕的東東,其實並不複雜,但是一個想要一個好的雜湊函式不簡單。 這個雜湊函式,這是來自於雲風的部落格,來自於 Lua 的實現,說起他,一個人向中國推薦了 Lua 指令碼,值得佩服。 unsigned long hash(con

題目練習*****7-17 電話聊天狂人(25 分)

傳送門 給定大量手機使用者通話記錄,找出其中通話次數最多的聊天狂人。 輸入格式: 輸入首先給出正整數N(≤10​5​​),為通話記錄條數。隨後N行,每行給出一條通話記錄。簡單起見,這裡只列出撥出

[SCOI2007]壓縮(動態規劃,區間dp,字串)

[SCOI2007]壓縮 狀態:設\(dp[i][j]\)表示前i個字元,最後一個\(M\)放置在\(j\)位置之後的最短字串長度. 轉移有三類,用刷表法來實現. 第一種是直接往壓縮串後面填字元,這樣就是: \[dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)\] 另外一種

C++【模板】字串

介紹:關於字串hash,一句話概括,就是把字串有效的轉化為一個整數 hash[i]=(hash[i-1]*p+idx(s[i]))%mod for example:取p=13, mod=101,求abc對應的整數 hash[0]=1; 表示a對映1。 hash[1]=(hash[0]

51Nod1553 週期串查詢 字串 線段樹

原文連結https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html 題目傳送門 - 51Nod1553 題意   有一個串只包含數字字元。串的長度為n,下標從1開始。   有兩種操作方式:   1 l r c (1≤l≤r≤n, c是數字字元),表示將

(集合框架)字串物件的

物件的雜湊值,是一個和普通的十進位制值,物件的雜湊值,源自於父類Object    String類繼承Object類,重寫了hashCode方法,所以它有了自己算雜湊值的方法 下面關注String類繼承Object類,重寫父類的方法hashCode