반응형
KMP 알고리즘
보통 문자열 안에서 패턴을 찾는 알고리즘을 만들때 가장 쉽게 생각해볼 수 있는 것은 문자 하나하나마다 패턴과 일치하는지 체크하는 방법일겁니다. 그런데 위 방법은 당연하게도 시간 복잡도
flrjtwjrjt.tistory.com
1305번: 광고
세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것이 무엇인지 궁금해지기 시작했다. 전광
www.acmicpc.net
가능한 광고의 길이중 가장 짧은 것의 길이를 출력
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<int> makeTable(string pattern)
{
vector<int> table(pattern.size(), 0);
int head = 0;
for (int tail = 1; tail < pattern.size(); tail++)
{
while (head > 0 && pattern[head] != pattern[tail])
head = table[head - 1];
if (pattern[head] == pattern[tail])
{
table[tail] = ++head;
}
}
return table;
}
int main()
{
int size;
string pattern;
cin >> size;
cin >> pattern;
vector<int> table = makeTable(pattern);
cout << size - table[size - 1];
return 0;
}
위 코드에서 주의깊게 봐야할 부분은
cout << size - table[size - 1];
이 코드입니다.
table은 접두사와 중복되는 문자의 위치와 중복의 길이를 담고 있습니다
따라서"광고판의 사이즈"에
"광고판 끝에 위치한 문자가 담고 있는 중복되는 길이"를 뺴면
광고의 길이중 가장 짧은 것의 길이를 구할 수 있게 되는 겁니다.
반응형
LIST
'알고리즘 문제 > 백준' 카테고리의 다른 글
[C++] ACM Craft(위상 정렬) - 1005 (0) | 2023.01.09 |
---|---|
[C++] 에라토스테네스의 체 - 2960 (0) | 2023.01.05 |
[C++] 찾기(KMP) - 1786 (0) | 2023.01.04 |
[C++] Cubeditor(KMP) - 1701 (0) | 2023.01.03 |
[C++] 거의 최단 경로(Dijkstra) - 5719 (1) | 2023.01.01 |