반응형
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> makeTable(string str)
{
int size = str.size();
vector<int> table(size, 0);
int j = 0;
for (int i = 1; i < size; i++)
{
while (j > 0 && str[j] != str[i])
{
j = table[j - 1];
}
if (str[i] == str[j])
{
table[i] = ++j;
}
}
return table;
}
int KMP(string pattern, string parent)
{
int patternSize = pattern.size();
int parentSize = parent.size();
int count = 0;
int j = 0;
vector<int> table = makeTable(pattern);
for (int i = 0; i < parentSize; i++)
{
while (j > 0 && parent[i] != pattern[j])
{
j = table[j - 1];
}
if (parent[i] == pattern[j])
{
if (j == patternSize - 1)
{
count++;
j = table[j];
}
else
{
++j;
}
}
}
return count;
}
int main(int argc, char** argv)
{
int test_case;
for (test_case = 1; test_case <= 10; ++test_case)
{
int t;
cin >> t;
string pattern, parent;
cin >> pattern >> parent;
cout << "#"<<t << " " <<KMP(pattern, parent) << endl;
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
[문자열 단계] 백준 11720번 숫자의 합 (0) | 2020.09.20 |
---|---|
[문자열 단계] 백준 11654번 아스키 코드 (0) | 2020.09.20 |
백준 10830 행렬 제곱 oo (0) | 2020.09.19 |
백준 2099번 The game of death (0) | 2020.09.18 |
백준 1890번 점프 (0) | 2020.09.18 |