코딩스토리

백준 16900번 - 이름 정하기 본문

알고리즘/BOJ 문제 풀이

백준 16900번 - 이름 정하기

kimtaehyun98 2020. 9. 17. 17:31

백준 16900번 - 이름 정하기

www.acmicpc.net/problem/16900

 

16900번: 이름 정하기

첫째 줄에 S와 K가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 500,000보다 작거나 같다. K는 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

KMP 알고리즘 문제이다.

사실 KMP라 하기도 조금 아쉽지만 어쨌든 Pi (접두사 == 접미사 인 최장길이)만 사용하면 해결 가능하다.

 

계속해서 더해갈 건데 이때 pi가 중요하다.

이유는 접두사==접미사 라면 그만큼의 길이를 빼고 더해줘야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
vector<int>getPartialMatch(const string& N) {
    int m = N.size();
    vector<int>pi(m, 0); 
    int begin = 1, matched = 0;
    while (begin + matched < m) {
        if (N[begin + matched] == N[matched]) {
            ++matched;
            pi[begin + matched - 1= matched;
        }
        else {
            if (matched == 0) {
                ++begin;
            }
            else {
                begin += matched - pi[matched - 1];
                matched = pi[matched - 1];
            }
        }
    }
    return pi;
}
 
int main() {
    int k;
    string str;
    cin >> str >> k;
    vector<int>pi = getPartialMatch(str);
    int size = str.size();
    long long ans = size;
    for (int i = 1; i < k; i++) {
        ans += size - pi[size - 1];
    }
    cout << ans << "\n";
}
cs

ans의 자료형이 long long임에 주의하자

'알고리즘 > BOJ 문제 풀이' 카테고리의 다른 글

백준 2477번 - 참외밭  (0) 2020.10.19
백준 1043번 - 거짓말  (0) 2020.10.16
백준 9248번 - Suffix Array  (0) 2020.09.13
백준 1543번 - 문서 검색  (0) 2020.09.09
백준 9663번 - N-Queen  (0) 2020.08.28
Comments