Skip to content

Commit 082f847

Browse files
committed
Quartz sync: Jul 3, 2025, 11:52 AM
1 parent 60a53cc commit 082f847

File tree

5 files changed

+125
-16
lines changed

5 files changed

+125
-16
lines changed
Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,59 @@
11
---
2-
created: 2025/5/09 08:29:04
3-
modified: 2025/5/09 08:35:14
2+
description:
3+
created: 2025-05-18
4+
modified: 2025-07-03
45
aliases:
56
- kmp
67
- kmp algorithm
78
---
8-
- ```cpp
9-
int M = //string size;
10-
vector<int> pi(M, 0);
11-
12-
for (int i = 1; i < M; ++i) {
9+
10+
- 접두사, 접미사로 문자열 일치 판별
11+
- $O(N+M)$
12+
- [[Two Pointers]] 기법
13+
- `j`
14+
- 접두사 인덱스
15+
- i 위치의 값과 일치하면
16+
- +1하고, 그 값을 테이블에 저장
17+
- 불일치시
18+
- 마지막 일치 순간으로 j 이동
19+
- `i`
20+
- 접미사 인덱스
21+
- 한칸씩 이동하면서 일치 판별
22+
- ```cpp
23+
vector<int> make_table(const string& pattern){
24+
vector<int> table(pattern.size(), 0);
25+
int j = 0;
26+
27+
for (int i = 1; i < pattern.size(); ++i) {
1328

14-
int j = pi[i - 1];
15-
16-
while (j > 0 && comb[i] != comb[j])
17-
j = pi[ j - 1];
18-
19-
if (comb[i] == comb[j]) ++j;
29+
while (j > 0 && pattern[i] != pattern[j])
30+
j = table[j - 1];
31+
32+
if (pattern[i] == pattern[j])
33+
table[i] = ++j;
34+
}
2035

21-
pi[i] = j;
36+
return table;
2237
}
2338

24-
return pi[M-1];
39+
void KMP(const string& s, const string& needle){
40+
vector<int> table = make_table(needle);
41+
int s_size = s.size();
42+
int needle_size = needle.size();
43+
int j = 0;
44+
45+
for(int i = 0; i < s_size; ++i){
46+
while (j > 0 && s[i] != needle[j])
47+
j = table[j - 1];
48+
49+
if (s[i] == needle[j]){
50+
if (j == needle_size - 1){
51+
j = table[j];
52+
// i - needle_size + 1 에서 매칭
53+
// or i - j
54+
}
55+
else
56+
++j;
57+
}
58+
}
59+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
description:
3+
aliases:
4+
created: 2025-07-02
5+
modified: 2025-07-02
6+
---
7+
8+
- cpp
9+
- remain
10+
- python
11+
- modulo
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
description:
3+
aliases:
4+
- 유클리드 호제법
5+
created: 2025-07-02
6+
modified: 2025-07-02
7+
---
8+
9+
- 유클리드 호제법
10+
- $gcd(a,b) = gcd(b, a \, mod \, b)$
11+
- $lcm(a, b) = a * b / gcd(a, b)$
12+
- ```cpp
13+
int gcd(int a, int b){
14+
if (b == 0) return a;
15+
return gcd(b, a % b);
16+
}
17+
18+
int lcm(int a, int b){
19+
// 오버 플로우 방지로 미리 나누고, 곱하기
20+
return a / gcd(a, b) * b;
21+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
created: 2025/5/03 14:44:32
3+
modified: 2025/5/03 20:31:14
4+
aliases:
5+
- is prime
6+
tags:
7+
- "#field/default"
8+
- "#format/default"
9+
- "#stage/facts"
10+
references:
11+
---
12+
<!--
13+
[[내 노트 정리 방법#^bb9ac3|my workflow]]
14+
- main
15+
- 출처
16+
- 저자
17+
- 인용(contents)
18+
- footer
19+
- 내 의견
20+
- 내 의문
21+
- 요약
22+
- 추가 조사해야할 점
23+
- todo list
24+
- 관련노트
25+
-->
26+
- 한 숫자만 검증
27+
- 기본 최적화
28+
- $1 \sim \sqrt{n}$까지 곱셉 비교 `i * i <= n`
29+
```cpp
30+
bool is_prime(int n){
31+
if ( n <= 1 ) return false;
32+
if ( n == 2) return true;
33+
for (int i = 2; i * i <= n; i += 2){
34+
if (n % i == 0)
35+
return false;
36+
}
37+
return true;
38+
}
39+
```
40+
- 여러 숫자 검증
41+
- 에라토스테네스의 체
42+
- 특정 범위까지 `2의 배수... n의 배수` false 판별한 brutal force 배열을 사용

content/Computer Science/1 Foundations & Theory/Data Structures/Fenwick tree (index tree).md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ modified: 2025-07-02
2222
void update(int i, int dif){
2323
// update값이 dif
2424
// 기존 값과의 dif를 점진적 비트 크기로 이동하면서 업데이트
25-
while (i <= sum_size){
25+
while (i < sum_size){
2626
tree[i] += dif;
2727
i += (i & -i);
2828
}

0 commit comments

Comments
 (0)