[백준/BOJ] 백준 1305번 : 광고

2021. 2. 18. 21:11알고리즘 문제풀이

www.acmicpc.net/problem/1305

 

1305번: 광고

세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것이 무엇인지 궁금해지기 시작했다. 전광

www.acmicpc.net

KMP알고리즘의 pi를 구해서 문제를 해결했다. 만들어진 pi를 이용하여, 전체 문자열에서 접두사와 접미사가 같은 최대 문자열의 접두사 문자열 하나 제거한 문자열의 길이를 출력했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

//알고리즘 문제해결 전략2 책 KMP 알고리즘 공부 실습
//KMP알고리즘의 pi를 구해서 문제를 해결
int L;
string input;
vector<int> pi(1000000, 0);

void Make_pi()
{
	int start = 1;
	int matched = 0;

	while (start + matched < L)
	{
		if (input[matched] == input[start + matched])
		{
			matched++;
			pi[start + matched - 1] = matched;
		}

		else
		{
			if (matched == 0)
			{
				start++;
				matched = 0;
			}

			else
			{
				start += matched - pi[matched - 1];
				matched = pi[matched - 1];
			}
		}
	}
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> L;
	cin >> input;

	Make_pi();

	cout << L - pi[L - 1]; //전체 문자열에서 접두사와 접미사가 같은 최대 문자열의 접두사 문자열 하나 제거한 문자열의 길이

	return 0;
}