알고리즘 문제/백준

[C++] 광고(KMP) - 1305

우대비 2023. 1. 4. 11:11
반응형
 

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