[λ°±μ€] 15829λ² - Hashing (C++)
https://www.acmicpc.net/problem/15829
λ¬Έμ
APCμ μ¨ κ²μ νμνλ€. λ§μ½ μ¬λ¬λΆμ΄ νκ΅μμ μλ£κ΅¬μ‘°λ₯Ό μκ°νλ€λ©΄ ν΄μ ν¨μμ λν΄ λ°°μ μ κ²μ΄λ€. ν΄μ ν¨μλ μμμ κΈΈμ΄μ μ λ ₯μ λ°μμ κ³ μ λ κΈΈμ΄μ μΆλ ₯μ λ΄λ³΄λ΄λ ν¨μλ‘ μ μνλ€. ν΄μ ν¨μλ 무κΆλ¬΄μ§ν μμ© λΆμΌλ₯Ό κ°λλ°, λνμ μΌλ‘ μλ£μ μ μ₯κ³Ό νμμ μ°μΈλ€.
μ΄ λ¬Έμ μμλ μ¬λ¬λΆμ΄ μμΌλ‘ μ μ©νκ² μΈ μ μλ ν΄μ ν¨μλ₯Ό νλ κ°λ₯΄μ³μ£Όκ³ μ νλ€. λ¨Όμ , νΈμμ μ λ ₯μΌλ‘ λ€μ΄μ€λ λ¬Έμμ΄μλ μλ¬Έ μλ¬Έμ(a, b, ..., z)λ‘λ§ κ΅¬μ±λμ΄μλ€κ³ κ°μ νμ. μμ΄μλ μ΄ 26κ°μ μνλ²³μ΄ μ‘΄μ¬νλ―λ‘ aμλ 1, bμλ 2, cμλ 3, ..., zμλ 26μΌλ‘ κ³ μ ν λ²νΈλ₯Ό λΆμ¬ν μ μλ€. κ²°κ³Όμ μΌλ‘ μ°λ¦¬λ νλμ λ¬Έμμ΄μ μμ΄λ‘ λ³νν μ μλ€. μλ₯Ό λ€μ΄μ λ¬Έμμ΄ "abba"μ μμ΄ 1, 2, 2, 1λ‘ λνλΌ μ μλ€.
ν΄μ κ°μ κ³μ°νκΈ° μν΄μ μ°λ¦¬λ λ¬Έμμ΄ νΉμ μμ΄μ νλμ μ μλ‘ μΉννλ €κ³ νλ€. κ°λ¨νκ²λ μμ΄μ κ°μ λͺ¨λ λν μλ μλ€. ν΄μ ν¨μμ μ μμμ μ νν λ²μμ μΆλ ₯μ κ°μ ΈμΌ νλ€κ³ νμΌλκΉ μ λΉν ν° μ MμΌλ‘ λλ μ£Όμ. μ§μ! ν΄μ ν¨μκ° μμ±λμλ€. μ΄λ₯Ό μμμΌλ‘ νννλ©΄ μλμ κ°λ€.
βH=∑i=0l−1aimodM
βν΄μ ν¨μμ μ λ ₯μΌλ‘ λ€μ΄μ¬ μ μλ λ¬Έμμ΄μ μ’ λ₯λ 무ννμ§λ§ μΆλ ₯ λ²μλ μ ν΄μ Έμλ€. λ€λ€ λΉλκΈ° μ§μ μ리μ λν΄μλ ν λ²μ―€ λ€μ΄λ΄€μ κ²μ΄λ€. κ·Έ μ리μ μνλ©΄ μλ‘ λ€λ₯Έ λ¬Έμμ΄μ΄λλΌλ λμΌν ν΄μ κ°μ κ°μ§ μ μλ€. μ΄λ₯Ό ν΄μ μΆ©λμ΄λΌκ³ νλλ°, μ’μ ν΄μ ν¨μλ μ΅λν μΆ©λμ΄ μ κ² μΌμ΄λμΌ νλ€. μμμ μ μν ν΄μ ν¨μλ μνλ²³μ μμλ§ λ°κΏλ μΆ©λμ΄ μΌμ΄λκΈ° λλ¬Έμ λμ ν΄μ ν¨μμ΄λ€. κ·Έλ¬λκΉ μ‘°κΈ λ κ°μ ν΄λ³΄μ.
μ΄λ»κ² νλ©΄ μμκ° λ¬λΌμ‘μλ μΆλ ₯κ°λ λ¬λΌμ§κ² ν μ μμκΉ? 머리λ₯Ό ꡴리면 μμ΄μ κ° νλ§λ€ κ³ μ ν κ³μλ₯Ό λΆμ¬νλ©΄ λλ€λ μμ΄λμ΄λ₯Ό μκ°ν΄λ³Ό μ μλ€. κ°μ₯ λνμ μΈ λ°©λ²μ νμ λ²νΈμ ν΄λΉνλ λ§νΌ νΉμ ν μ«μλ₯Ό κ±°λμ κ³±ν΄μ κ³±ν΄μ€ λ€μ λνλ κ²μ΄ μλ€. μ΄λ₯Ό μμμΌλ‘ νννλ©΄ μλμ κ°λ€.
βH=∑i=0l−1airimodM
βλ³΄ν΅ rκ³Ό Mμ μλ‘μμΈ μ«μλ‘ μ νλ κ²μ΄ μΌλ°μ μ΄λ€. μ°λ¦¬κ° μ§μ μ νλΌκ³ νλ©΄ νλ€ν λκΉ rμ κ°μ 26λ³΄λ€ ν° μμμΈ 31λ‘ νκ³ Mμ κ°μ 1234567891(λλκ²λ μμμ΄λ€!!)λ‘ νμ.
μ΄μ μ¬λ¬λΆμ΄ ν μΌμ μ μμ ν΅ν΄ μ£Όμ΄μ§ λ¬Έμμ΄μ ν΄μ κ°μ κ³μ°νλ κ²μ΄λ€. κ·Έλ¦¬κ³ μ΄ ν¨μλ κ°λ¨ν΄ 보μ¬λ μμ£Ό μ°μ΄λκΉ κΈ°μ΅ν΄λλ€κ° μ μ¨λ¨Ήλλ‘ νμ.
μ λ ₯
첫 μ€μλ λ¬Έμμ΄μ κΈΈμ΄ Lμ΄ λ€μ΄μ¨λ€. λμ§Έ μ€μλ μλ¬Έ μλ¬Έμλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μ΄ λ€μ΄μ¨λ€.
μ λ ₯μΌλ‘ μ£Όμ΄μ§λ λ¬Έμμ΄μ λͺ¨λ μνλ²³ μλ¬Έμλ‘λ§ κ΅¬μ±λμ΄ μλ€.
μΆλ ₯
λ¬Έμ μμ μ£Όμ΄μ§ ν΄μν¨μμ μ λ ₯μΌλ‘ μ£Όμ΄μ§ λ¬Έμμ΄μ μ¬μ©ν΄ κ³μ°ν ν΄μ κ°μ μ μλ‘ μΆλ ₯νλ€.
Small (50μ )
- 1 ≤ L ≤ 5
Large (50μ )
- 1 ≤ L ≤ 50
νμ΄κ³Όμ
λ¬Έμ μ νμ΄μμ μλΉν κ°λ¨νλ€.
μμ κ°μ μμ ꡬ쑰λ₯Ό κ°μ§κ³ μκ³ , λ¬Έμ μ ννΈμ λμμλ κ²μ²λΌ (μνλ²³ μ«μ) * (31 * μνλ²³μμΉ) μμ μ νμμ μ¬μ©νλ©΄ λλ€.
ν΄λΉ λ¬Έμ μ κ²½μ° smallκ³Ό largeλ‘ λλμ΄μ Έμλλ° largeμ κ²½μ°μλ μ«μκ° λ무 컀μ§κ° λλ μ«μκ° m (1234567891) λ³΄λ€ μ»€μ§κ² λλ©΄ % m μ μμ μ κ°νλ©΄ λλ€.
pow μ κ²½μ°μλ μμμ μ°μ°μ ν¬ν¨νμ¬ μ νν μ μκ° λ³΄μ₯λμ§μκΈ°λλ¬Έμ λ°λ³΅μ μΌλ‘ 31μ κ³±νλ λͺ¨λλ¬ μ°μ° λ°©μμ μ¬μ©ν΄μΌνλ€.
code
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
long long sum = 0;
long long M = 1234567891;
long long r = 1;
string l;
cin >> n >> l;
for (int i = 0; i < l.size(); i++) {
int a = (l[i] - 'a' + 1);
sum = (sum + (a * r) % M) % M;
r = (r * 31) % M;
}
cout << sum << endl;
return 0;
}
νκΈ°
pow ν¨μμ λν μ νν μ΄ν΄λ₯Ό κ°μ§κ³ μμ§μμ κ΄ν κ³ μμ νμλ€.