PTA 7-17(查找) 字符串关键字的散列映射(25 分) 25分代码

来源:互联网 发布:手机p2p软件下载 编辑:程序博客网 时间:2024/06/05 04:19

需要注意的就是冲突的处理那部分,数据结构课本上的知识,运用 平方探测法解决


#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<set>#include<map>using namespace std;const int maxn = 1000000 + 7, INF = 0x7f7f7f7f, mod = 1e9+7;int n, m;string s;// t;map<string, int> mp;bool vis[maxn] = {false};int main() {    scanf("%d %d", &n, &m);    for(int i = 1; i <= n; ++i) {        cin >> s; int len = s.size();        int num = 0;        if(len == 1) {            num += (s[0]-'A');        }        else if(len == 2) {            num = 32*(s[0]-'A') + (s[1]-'A');        }        else {            for(int j = 3; j >= 1; --j) {                int pos = len - j;                num = num * 32 + s[pos] - 'A';            }        }        num %= m;        if(mp[s] == 0 && vis[num]) {            for(int t = 1; t < maxn; ++t) {                if(!vis[(num+t*t)%m]) {                    num = (num+t*t)%m;                    vis[num] = true;                    mp[s] = num;                    cout << num;                    break;                }                else if(!vis[(num-t*t+m)%m]) {                    num = (num-t*t+m)%m;                    vis[num] = true;                    mp[s] = num;                    cout << num;                    break;                }            }        }        else {            num %= m;            mp[s] = num;            cout << num;            vis[num] = true;        }        if(i < n) cout << " ";        else cout << endl;    }    return 0;}


阅读全文
1 0
原创粉丝点击