2014-09-13 2 views
-7

Я получаю неправильный ответ, решая вопрос HASH IT. Я не могу понять, где я ошибаюсь. Может кто-то дать некоторые тестовые примеры, когда мой код не работает. Заранее спасибо :)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

+0

Пожалуйста, задайте конкретный вопрос. Что это должно делать, и что он делает неправильно? – Barmar

ответ

1

Вы возложена задача реализации Hashtable - это включает в себя определение типов данных и функций, чтобы манипулировать этими типами. Я понятия не имею, что вы делаете.

Сначала определите хэш-таблицу - сделайте это, задав два типа; один тип таблицы и один тип слота.

typedef struct table table; 
typedef struct slot slot; 

Таблица представляет собой простой массив слотов:

struct table { 
    slot slots[101]; 
} 

Слот представляет собой набор данных, относящийся к определяющей строке:

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

Слот либо неиспользуемый, удаляются или используется в зависимости от значения статуса. Хэш слота - это значение хеш-функции на ключевой строке. Ключевая строка хранится в ключевой переменной.

Чтобы сохранить строку в таблице, просто найдите подходящий слот и перезапишите данные. Для этого найдите все слоты (используя описанный алгоритм), пока не найдете неиспользуемый слот или тот, который уже соответствует ключу. Если вы не можете найти ни одного, найдите удаленный слот и перезапишите слот.

Чтобы найти строку, перейдите через таблицу - если слот соответствует ключу, верните его, если вы найдете неиспользуемый слот или найдите соответствующий слот, который был удален, остановите процесс. Если вы посмотрели все слоты, остановитесь также.

Чтобы удалить строку, сначала найдите ее, а затем установите статус для удаления.

Смежные вопросы