알고리즘 문제/백준

[C++] Cubeditor(KMP) - 1701

우대비 2023. 1. 3. 11:46
반응형
 

KMP 알고리즘

보통 문자열 안에서 패턴을 찾는 알고리즘을 만들때 가장 쉽게 생각해볼 수 있는 것은 문자 하나하나마다 패턴과 일치하는지 체크하는 방법일겁니다. 그런데 위 방법은 당연하게도 시간 복잡도

flrjtwjrjt.tistory.com


위 문제는 KMP 알고리즘에서

pattern table 만드는 것만 알면 풀 수 있는 아주 간단한 문제 입니다.

 

두번 이상 검색되는 패턴중에 가장 긴 패턴의 길이를 구하는 것인데

pattern table 생성하는 과정에서 가장긴 접미사를 가진 애만 찾으면 해결되는 문제입니다.

 

 

int KMP(string str)
{
	vector<int> table(str.size());
	for (int head = 0, tail = 1; tail < str.size(); tail++)
	{
		while (head > 0 && str[head] != str[tail])
			head = table[head - 1];

		if (str[head] == str[tail])
			table[tail] = ++head;
	}

	int MAX = 0;
	for (int i = 0; i < str.size(); i++)
		if (MAX < table[i]) MAX = table[i];

	return MAX; // 테이블에 저장된 값 중에서 가장 큰 값을 리턴
}

 

 

int main()
{
	string str;
	cin >> str;

	int MAX = 0;
	for (int i = 0; i < str.size(); i++)
	{
		// 맨 앞의 문자 하나씩 때어서
		// 여러 경우에서의 패턴 테이블을 만듬
		int n = KMP(str.substr(i, str.size() - i));
		if (MAX < n) MAX = n;
	}
	cout << MAX;
	return 0;
}

 

반응형
LIST

'알고리즘 문제 > 백준' 카테고리의 다른 글

[C++] 광고(KMP) - 1305  (0) 2023.01.04
[C++] 찾기(KMP) - 1786  (0) 2023.01.04
[C++] 거의 최단 경로(Dijkstra) - 5719  (1) 2023.01.01
[C++] 파티(Dijkstra) - 1238  (1) 2022.12.22
[C++] 가운데를 말해요 - 1655  (2) 2022.12.10