๐Ÿ’  BOJ/Class 2

[BOJ][C++] ๋ฐฑ์ค€ 15829๋ฒˆ: Hashing

์„ ๋‹ฌ 2023. 4. 6. 21:22
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/15829

 

15829๋ฒˆ: Hashing

APC์— ์˜จ ๊ฒƒ์„ ํ™˜์˜ํ•œ๋‹ค. ๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด ํ•™๊ต์—์„œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ˆ˜๊ฐ•ํ–ˆ๋‹ค๋ฉด ํ•ด์‹œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋ฐฐ์› ์„ ๊ฒƒ์ด๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜๋ž€ ์ž„์˜์˜ ๊ธธ์ด์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด๋Š” ํ•จ์ˆ˜๋กœ ์ •

www.acmicpc.net

 

๋ฌธ์ œ

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
  •  

ํ’€์ด

๋ฌธ์ œ๊ฐ€ ์—„์ฒญ ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ธด ํ•˜์ง€๋งŒ ๋ง‰์ƒ ๊ตฌํ˜„์€ ์‰ฝ๋‹ค

 

๋Œ€์‹ .. 100์  ๋งž์œผ๋ ค๊ณ .. ๋ฒ”์œ„ ์ดˆ๊ณผ ์•ˆ๋˜๋ ค๊ณ ......

m์„ ๋‚˜๋ˆ„๊ณ  ๋‚˜๋ˆ„๊ณ  ๋‚˜๋ˆ„๊ณ  ๋‚˜๋ˆด๋‹ค..

๊ทธ๋ ‡๊ฒŒ ํ•ด๋„ int๋ฉด ์•ˆ๋œ๋‹ค. long long ์จ์•ผํ•จ

// https://whkakrkr.tistory.com

#include <iostream>

using namespace std;

int main () {
    int n;
    string s;
    cin >> n >> s;
    
    long long ans = 0;
    long long r = 1, m = 1234567891; 
    for(int i=0; i<n; i++) {
        ans += ((s[i] - 'a' + 1) * r) % m;
        ans %= m;
        r *= 31;
        r %= m;
    }
    
    cout << ans;
    
    return 0;
}
๋ฐ˜์‘ํ˜•