寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

paizaラーニング: C++による「ハッシュメニュー」問題集: ハッシュ関数を作ってみよう

paizaラーニングのレベルアップ問題集「ハッシュメニュー」からの出典です。
paiza.jp
C++による「ハッシュメニュー」問題集: 座標系での向きの変わる移動と、それらの提出コードの解答例です。

僕が作成、提出したコードは、以下のとおりです。

・STEP: 1 ハッシュ関数とは

paiza.jp

/*
paizaラーニング: C++による「ハッシュメニュー」問題集: ハッシュ関数を作ってみよう
STEP: 1 ハッシュ関数とは
https://paiza.jp/works/mondai/hash_problems/hash_problems__basic_step0
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n,mod;
ll H(ll x){
    return x%mod;
}
int main(void){
    cin>>n>>mod;
    for(ll i=0;i<n;i++){
        ll x;
        cin>>x;
        cout<<H(x)<<endl;
    }
    return 0;
}
・STEP: 2 やや複雑なハッシュ

paiza.jp

/*
paizaラーニング: C++による「ハッシュメニュー」問題集: ハッシュ関数を作ってみよう
STEP: 2 やや複雑なハッシュ
https://paiza.jp/works/mondai/hash_problems/hash_problems__basic_step1
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll a,b,mod;
ll H(ll x){
    return (a*x+b)%mod;
}
int main(void){
    ll n;
    cin>>n>>a>>b>>mod;
    for(ll i=0;i<n;i++){
        ll x;
        cin>>x;
        cout<<H(x)<<endl;
    }
    return 0;
}
・STEP: 3 文字列のハッシュ

paiza.jp

/*
paizaラーニング: C++による「ハッシュメニュー」問題集: ハッシュ関数を作ってみよう
STEP: 3 文字列のハッシュ
https://paiza.jp/works/mondai/hash_problems/hash_problems__basic_step2
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define all(v) v.begin(),v.end()
ll n;
ll H(string s){
    ll ret=0;
    ret+=count(all(s),'p');
    ret+=count(all(s),'a');
    ret+=count(all(s),'i');
    ret+=count(all(s),'z');
    return ret;
}
int main(void){
    cin>>n;
    for(ll i=0;i<n;i++){
        string s;
        cin>>s;
        cout<<H(s)<<endl;
    }
    return 0;
}
・FINAL問題: ハッシュ関数を作ってみよう

paiza.jp

/*
paizaラーニング: C++による「ハッシュメニュー」問題集: ハッシュ関数を作ってみよう
FINAL問題: ハッシュ関数を作ってみよう
https://paiza.jp/works/mondai/hash_problems/hash_problems__basic_boss
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll H(string s){
    return s.size()*s.size();
}
int main(void){
    ll n;
    cin>>n;
    for(ll i=0;i<n;i++){
        string s;
        cin>>s;
        cout<<H(s)<<endl;
    }
    return 0;
}

paizaラーニングのレベルアップ問題集については、ユーザー同士で解答を教え合ったり、コードを公開したりするのは自由としています。
また授業や研修、教材などにも利用できるそうです。