2014-09-13 2 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

+0

특정 질문을하십시오. 이 일이 무엇이고, 무엇이 잘못 되었습니까? – Barmar

답변

1

당신은 해시 테이블을 구현하는 임무가 주어 왔습니다 -이 그 유형을 조작 할 데이터 유형 및 기능을 정의하는 작업이 포함됩니다. 니가 뭘하고 있는지 나는 모른다.

먼저 해시 테이블을 정의하십시오. 두 가지 유형을 정의하여이를 수행하십시오. 하나의 테이블 유형과 하나의 슬롯 유형. 슬롯은 하나 미사용, 삭제

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

:

struct table { 
    slot slots[101]; 
} 

슬롯이 정의 문자열에 관련된 데이터의 집합이다

typedef struct table table; 
typedef struct slot slot; 

테이블 슬롯의 간단한 배열 또는 상태 값에 따라 사용 중일 수 있습니다. 슬롯의 해시는 키 문자열의 해시 함수 값입니다. 키 문자열은 키 변수에 저장됩니다.

문자열을 테이블에 저장하려면 적절한 슬롯을 찾아 데이터를 덮어 쓰기 만하면됩니다. 이렇게하려면 사용되지 않는 슬롯이나 이미 키와 일치하는 슬롯을 찾을 때까지 설명 된 알고리즘을 사용하여 모든 슬롯을 검색하십시오. 찾을 수없는 경우 삭제 된 슬롯을 찾아 슬롯을 덮어 씁니다.

문자열을 찾으려면 표를 단계별로 살펴보십시오. 슬롯이 키와 일치하면 반환합니다. 사용되지 않은 슬롯을 찾거나 삭제 된 일치하는 슬롯을 찾으면 프로세스를 중지하십시오. 모든 슬롯을 살펴본 경우 중지하십시오.

문자열을 삭제하려면 먼저 문자열을 찾아 상태를 삭제됨으로 설정하십시오.

관련 문제