데이터 구조 기록 - 산열 법 실험
Web Board
ProblemSet
Standing
Status
Statistics
Problem A: 산열 법의 실험
Time Limit: 1 Sec
Memory Limit: 128 MB
Submit: 1008
Solved: 310
[ Submit][ Status][ Web Board]
Description
산열 법 에 서 는 산열 함수 구조 방법 이 다양 하 며 같은 산열 함수 에 대해 충돌 을 해결 하 는 방법 도 다 를 수 있다.두 가 지 는 검색 알고리즘 의 성능 에 영향 을 주 는 관건 적 인 요소 이다.다음 해시 함수 로 문자열 해시 값 을 계산 합 니 다.H(key) = (s[0] * 31^(n – 1) + s[1] * 31 ^ (n – 2) + ….. + s[n – 1] * 31 ^ 0) % mod; 여기 서 ^ 곱셈, s [i] 문 자 를 대표 하 는 ASCII 값 은 2 차 탐지 재 산열 방법 으로 충돌 을 처리 합 니 다 Hi = (H (key) + di)% mod di = 1, - 1, 4, - 4, 9, - 9, 16, - 16.각 그룹의 샘플 에 대해 첫 번 째 줄 은 두 개의 숫자 N 과 mod (그 중 1 < = N < = 1000, N < mod < = 2000, mod 는 소수 이 고 문자열 의 길 이 는 1000 보다 작 음) 를 입력 하 며 N 과 mod 는 각각 문자열 의 개수 와 모델 을 표시 합 니 다.다음 n 줄 은 줄 마다 소문 자 만 있 는 문자열 입 니 다.
Input
샘플 은 EOF 가 끝 날 때 까지 여러 그룹 을 포함한다.각 그룹의 샘플 에 대해 첫 번 째 줄 은 두 개의 숫자 N 과 mod (그 중 1 < = N < = 1000, N < mod < = 2000, mod 는 소수 이 고 문자열 의 길 이 는 1000 보다 작 음) 를 입력 하 며 N 과 mod 는 각각 문자열 의 개수 와 모델 을 표시 합 니 다.다음 n 줄 은 줄 마다 소문 자 만 있 는 문자열 입 니 다.
Output
해시 함수 에 저 장 된 모든 키 워드 를 순서대로 출력 합 니 다. (해시 값 에 따라 작은 출력 문자열 까지)
Sample Input
5 11rgfslwdrzmiugiobmernjumq
Sample Output
5 4 6 2 3
HINT
해시 값 계산 과정 에서 모델 링 에 주의해 야 합 니 다. 넘 칠 수 있 는 두 가지 모델 링 공식: (a + b)% mod = (a% mod + b% mod)% mod (a – b)% mod = (a% mod – b% mod + mod)% mod
Append Code
[ Submit][ Status][ Web Board]
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define m 10005
typedef string KeyType;
typedef struct
{
KeyType key;
} HashTable;
long long int pow(int a,int b,int mod)
{
long long int x=1,y=a;
while(b)
{
if(b&0x1)
x=x*y%mod;
y=y*y%mod;
b>>=1;
}
return x;
}
int H(string s,int mod)
{
int key;
long long int k=0;
for(int i=0; i<s.length(); i++)
{
k+=(long long int)s[i]*pow(31,s.length()-1-i,mod);
}
key=k%mod;
return key;
}
int put(HashTable *HT,string s,int n,int mod)
{
int k=H(s,mod);
int Hi=H(s,mod);
if(HT[k].key.length()==0)
{
HT[k].key=s;
return k;
}
else
{
for(int i=1; i<31; i++)
{
Hi = ( H(s,mod)% mod+ pow(i,2,mod)) % mod;
if(HT[Hi].key.length()==0)
{
HT[Hi].key=s;
return Hi;
}
else
{
Hi = ( H(s,mod)%mod- pow(i,2,mod)+mod) % mod ;
if(HT[Hi].key.length()==0)
{
HT[Hi].key=s;
return Hi;
}
}
}
}
}
int main()
{
string st;
int n,mod;
while(scanf("%d %d",&n,&mod)!=EOF)
{
HashTable HT[m];
int temp[n];
for(int i=0; i<n; i++)
{
cin>>st;
temp[i]=put(HT,st,n,mod);
}
for(int i=0; i<n; i++)
{
if(i==0)
cout<<temp[i];
else
cout<<" "<<temp[i];
}
cout<<endl;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.