반응형
https://www.acmicpc.net/problem/1786
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
int* getLps(const string& _pattern_str){
int pattern_len = _pattern_str.length();
int *lps = (int *)malloc(sizeof(int)* pattern_len);
memset(lps, 0, sizeof(int)*pattern_len);
int j=0;
for(int i=1;i < pattern_len; i++){
while(j>0 && _pattern_str[i]!=_pattern_str[j]){
j = lps[j-1];
}
if(_pattern_str[i] == _pattern_str[j]){
j++;
lps[i] = j;
}
}
return lps;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
//Target, Pattern
string T, P;
getline(cin, T);
getline(cin, P);
int tLen = T.length();
int pLen = P.length();
int *lps = getLps(P);
int cnt = 0;
vector<int> v;
int j = 0;
for(int i=0; i<tLen; i++){
while(j>0 && T[i]!=P[j]){
j = lps[j-1];
}
if(T[i] == P[j]){
if(j==pLen-1){
v.push_back(i-pLen+1);
cnt++;
j = lps[j];
}
else{
j++;
}
}
}
cout << cnt << '\n';
for(auto i : v){
cout << i + 1 << ' ';
}
delete lps;
return 0;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
[백준] 2401 - 최대 문자열 붙여넣기 KMP + DP Cpp 코드 (0) | 2022.06.27 |
---|---|
[백준] 4354번 : 문자열 제곱 - 자세한 설명 포함 KMP 알고리즘 응용 (0) | 2022.06.25 |
백준 2512번: 예산 - binary search cpp (0) | 2022.06.22 |
백준 2110번 : 공유기 설치 - binary search , Decide problem - C++ (0) | 2022.06.22 |
[LeetCode] best-position-for-a-service-centre - ternary search (0) | 2022.06.22 |