2014-09-13 95 views
-7

我在解決問題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; 
} 
+0

您沒有機會獲得低質量的警告,甚至可能是因爲沒有正確格式化代碼而導致您工作的區塊? – Deduplicator 2014-09-13 19:55:07

+0

請提出具體問題。這應該做什麼,它做錯了什麼? – Barmar 2014-09-13 19:55:44

回答

1

你一直在負責實施哈希表 - 這包括定義數據類型和函數來處理這些類型。我不知道你在做什麼。

首先定義一個散列表 - 通過定義兩種類型來做到這一點;一個表格類型和一個插槽類型。

typedef struct table table; 
typedef struct slot slot; 

該表是槽的一個簡單的數組:

struct table { 
    slot slots[101]; 
} 

槽是數據的相關的一個限定串的集合:

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

甲時隙要麼未使用的,刪除或根據狀態的值使用。 槽的散列值是密鑰串上散列函數的值。 密鑰字符串存儲在密鑰變量中。

要在表格中存儲字符串,只需找到合適的插槽並覆蓋數據。要做到這一點,搜索所有的插槽(使用所描述的算法),直到找到一個未使用的插槽或已經匹配密鑰的插槽。如果找不到,則查找已刪除的插槽並覆蓋該插槽。

要查找字符串,請逐步查看錶格 - 如果某個槽匹配密鑰,則返回它,如果找到未使用的槽或找到已刪除的匹配槽,請停止該過程。如果你已經看過所有的插槽,那就停下來。

要刪除一個字符串,首先找到它,然後將狀態設置爲刪除。