Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 고속 푸리에 변환
- r
- 펜윅 트리
- BFS
- 우선순위 큐
- Cloud Run
- 다이나믹 프로그래밍
- 수학
- ICPC
- 백준 1753번
- LCS
- 시뮬레이션
- REACT
- CI/CD
- 삼성SW역량테스트
- dp
- 이분탐색
- 데이터 분석
- 접미사 배열
- Bit
- 종만북
- JavaScript
- 삼성 SW 역량테스트
- jpa
- Cloud Pub/Sub
- 생활코딩
- 컴퓨터 구조
- 그리디
- 다익스트라
- Air Table
Archives
- Today
- Total
코딩스토리
백준 16900번 - 이름 정하기 본문
백준 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