哈哈吧!!错误的答案,想不通

时间:2014-09-13 19:52:46

标签: c++ hash

在解决问题HASH IT时,我的回答是错误的。我无法弄清楚我哪里出错了。有人可以提供一些我的代码失败的测试用例。在此先感谢:)

链接到我的代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long int t;
    scanf("%lld",&t);
    while(t--){
        long long int x,i,f=0;
        string s,s1;
        map<long long int,string> m;
        map<string,long long int> m1;
        set<long long int> t;
        scanf("%lld",&x);
        for(i=0;i<x;i++){
            s1="";
            cin>>s;
            long long int j,ans=0;
            for(j=4;j<s.length();j++){
                ans=(ans+(int)(s[j])*(j-3))%101;
                s1+=s[j];
            }

            if(s[0]=='A'){

                ans=(ans*19)%101;
                //        cout<<ans<<endl;
                //        cout<<m[ans]<<s<<endl;
                if(m[ans].compare(s1)==0 || m[m1[s1]]==s1){ continue; }
                else if(m[ans]=="" ){
                    m[ans]=s1;
                    m1[s1]=ans;
                    f++;
                    t.insert(ans);
                }
                else{
                    long long int count=1;
                    while(count!=20){
                        if(m[(ans+(count*count)+(23*count))%101]==""){
                            m[(ans+(count*count)+(23*count))%101]=s1;
                            m1[s1]=(ans+(count*count)+(23*count))%101;
                            t.insert((ans+(count*count)+(23*count))%101);
                            f++;
                            break;
                        }
                        count++;
                    }
                } 
            }
            else{
                if(m[m1[s1]]==s1){
                    m[m1[s1]]="";
                    m1[s1]=-1;
                    --f;      
                }
                else if(m[m1[s1]].length()!=0){
                    m[m1[s1]]="";
                    m1[s1]=-1;
                    f--;
                }
            }
        }
        printf("%lld\n",f);
        set<long long int>::iterator it;
        for(it=t.begin();it!=t.end();it++){
            if(m[*it].length()!=0 && m1[m[*it]]!=-1)
                cout<<*it<<":"<<m[*it]<<endl;
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的任务是实现哈希表 - 这涉及定义数据类型和函数来操作这些类型。我不知道你在做什么。

首先定义一个哈希表 - 通过定义两个类型来做到这一点;一种表类型和一种插槽类型。

typedef struct table table;
typedef struct slot  slot;

该表是一个简单的插槽数组:

struct table {
    slot slots[101];
}

插槽是与定义字符串相关的数据集合:

struct slot {
    char status;
    int hash;
    char key[16];
};

根据状态值,插槽未使用,已删除或正在使用。 槽的哈希值是密钥串上的哈希函数的值。 密钥字符串存储在密钥变量中。

要在表格中存储字符串,只需找到合适的插槽并覆盖数据即可。要执行此操作,请搜索所有插槽(使用所述算法),直到找到未使用的插槽或已与插槽匹配的插槽。如果找不到,请查找已删除的插槽并覆盖插槽。

要查找字符串,请逐步执行该表 - 如果插槽与键匹配,则返回该字符串,如果找到未使用的插槽或找到已删除的匹配插槽,请停止该过程。如果你看过所有的插槽,也可以停下来。

要删除字符串,请先找到它,然后将状态设置为已删除。