
문제 https://www.acmicpc.net/problem/10747 알고리즘 KMP 풀이 KMP를 통해서 제거할 문자열의 위치를 찾아내는 접근까지는 쉽습니다. 검열할 문자를 없앤 후, 우리는 이전의 상태로 돌아가야 하는데, 이를 위해 matchCnt배열을 사용합니다. matchCnt[i] = 문자열 S의 i까지 봤을 때, 문자열 T와 일치하는 길이 벡터에 지금까지 확인한 S글자들을 담으며, 제거할 문자열을 찾았다면 벡터에서 T의 길이만큼 제거합니다. 그 후 이전의 상태, 즉 제거한 문자열의 첫 문자가 들어오기 직전의 상태로 돌아가야 합니다. KMP에서 j의 의미는 지금까지 매칭된 길이와도 동일하므로(구현에 따라 차이가 날 수 있음, 이 코드에선 매칭된 길이 -1입니다) j값을 $..

문제 https://www.acmicpc.net/problem/5446 알고리즘 트라이 풀이 제거해야 하는 문자열과 남겨야 하는 문자열이 주어지고, "문자열"+"*"을 통해 "문자열"로 시작하는 모든 문자열을 제거할 수 있다고 합니다. 접두사를 이용한다는 점에서 트라이를 착안해봅시다. 각 노드마다 yes,no,finish 를 만들어서 해당 노드를 제거해야하는지(yes), 제거해서는 안되는지(no), 제거해야 하는 문자가 끝나는지(finish)를 구분합니다. 만약 노드의 yes와 no가 둘 다 True 면 해당 노드를 제거해서는 안됩니다. (노드를 제거한다는 것은 와일드 카드를 사용해서 이후 노드를 보지 않겠다는 의미입니다) 이때 유의해야할 것은, 제거해서는 안 되는 노드에 $finish..

문제 https://www.acmicpc.net/problem/4354 알고리즘 KMP 풀이 드디어 만나게 된 S에서 W를 찾는 단순한 KMP가 아닌, 실패 함수 자체만을 사용하는 문제입니다. 실패 함수에는 여러 성질 및 특징이 있지만, 자주 만나게 되는 세 가지 큰 특징이 있습니다. 그 중 하나를 소개하겠습니다. 문자열에서 A글자의 패턴을 만들 수 있음과 문자열의 앞쪽(N-A)글자와 뒤쪽 (N-A)글자가 같음은 동치 이 문제를 풀땐 위 특징을 적극 활용하여 풀어봅시다. 주어진 문자열 S에 대하여 실패함수를 구했다면, 우리는 fail[slen−1] 이 가장 긴 접두사, 접미사의 길이임을 알게 됩니다. 문제에서 원하는 가장 큰 n을 구하기 위해선 반복되는 문자열의 길이가 가장 짧아야 하므..

문제 https://www.acmicpc.net/problem/1893 알고리즘 KMP 풀이 문제 이해가 조금 어려운(?) 문제였습니다. S 에서 W 를 찾되, W를 A에 따라 시프트 하며 새로운 W′에 대해서도 KMP를 수행하는 문제입니다. KMP를 수행하는 방식은 어렵지 않으니 남은 과제는 W를 어떻게 움직여야 하나 고민해야 합니다. 시프트를 수행할 때, 우리가 알아야할 정보는 현재 문자의 다음 문자를 알면 되므로 conv 배열을 통하여 해결하도록 합시다. KMP를 A 만큼 수행하고 새로운 W′를 만드는 데는 W 길이 만큼이 소요되므로 시간 복잡도는 O(A(W+S))입니다. 코드 #include #define rep(i,n) for(int i=0;i tc; wh..

문제 https://www.acmicpc.net/problem/1701 알고리즘 KMP 풀이 실패 함수의 의미를 알고 있어야 풀 수 있는 문제였습니다. fail[x] = y 는 문자열S의 처음 x+1 글자에서 일치하는 접두사/접미사 중 최대길이는 y 실패 함수를 기록할 때, 위 정의에 따라 두 번 이상 등장하는 부분 문자열(접두사, 접미사)이라는 조건 만족하게 됩니다. 그리고 원래 문자열의 모든 접두사만 고려하는 실패 함수는 중간에서 등장하는 부분 문자열을 고려하지 못하므로 KMP를 반복하며 원래 문자열의 맨 앞을 하나씩 제거하는 방식을 사용합니다. 원래의 실패함수내에서 j의 의미는 현재까지 매칭한 개수를 의미합니다. 그러나 원래 문자열의 맨 앞을 제거하기 위해 사용한 k로 인하..

문제 https://www.acmicpc.net/problem/1786 알고리즘 KMP 풀이 기초 KMP 적용문제입니다. 인덱스가 1부터 시작하는 점에 유의하며 풀면 됩니다. 주어지는 두 문자열의 길이가 각각 N,M 일 때, 시간복잡도는O(N+M) 입니다. ++ 개인적으로 실패함수 작성시 1−BASED 방식이 코드작성 측면에서 더 깔끔한 것 같습니다. 이후 KMP 문제에서 실패함수를 응용하는 문제들을 만나게 되면 이유를 느끼실수 있습니다. 저는 0−BASED 를 기준으로 코드를 작성하였으니, KMP 알고리즘을 입문하시는 분은 1−BASED 방식으로 입문하시는 것을 추천드립니다. 코드 #include #define rep(i,n) for(int i=0;i 0 && T[i] != P[j..
- Total
- Today
- Yesterday
- dfs
- 스위핑
- knapsack
- dijkstra
- kmp
- DP
- 펜윅트리
- Segment tree
- 2-SAT
- 이분매칭
- sweeping
- 동적계획법
- spring boot
- 트라이
- Suffix Array
- sorting
- implementation
- greedy
- SCC
- Fenwick
- Oracle
- string
- union find
- spring
- 정렬
- 이분탐색
- 세그먼트트리
- hld
- bfs
- 좌표압축
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |