-
백준 1701 CubeditorAlgorithm/BOJ(백준) 2018. 9. 6. 16:28
문제 링크 : https://www.acmicpc.net/problem/1701
※선행해야 할 알고리즘 : KMP AlgorithmAlgorithm부분 문자열마다의 pattern_table을 생성하여 그 중 값이 가장 큰 것을 return 한다.(해당 내용 : KMP Algorithm 참고)1. 여기서 말하는 "부분 문자열" 마다의 의미는 예제 입력 "abcdabcabb"을 기준으로 다음과 같다.(1) abcdabcabb (부분 문자열 1)(2) bcdabcabb (부분 문자열 2)(3) cdabcabb (부분 문자열 3)...(10) b (부분 문자열 10)2. "pattern_table"의 의미는 다음과 같다.문자열의 모든 부분 문자열의 접미사와 접두사가 같은 문자열의 문자 개수들을 나열한 table을 의미한다.여기서, 접두사와 접미사는 말 그대로 문자열의 머리와 꼬리이다.예를들어 "abcdabcaab"라는 문자가 있다면 접두사와 접미사는 다음과 같다.접두사 접미사a b c d a b c a a b따라서, 해당 문자열의 PatternTable은 다음과 같다.문자열aababcabcdabcdaabcdababcdabcabcdabcaabcdabcaaabcdabcaab패턴 테이블0 0 0 0 1 2 3 1 1 23. 2번을 모든 부분 문자열에 반복하여 최대값을 return하는 소스코드는 다음과 같다.//kuklife.tistory.com
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int maketable(string p)
{
int max = 0;
vector<vector<int>> table;
table.resize(p.size());
for (int k = 0; k < p.size(); k++)
{
table[k].resize(p.size()-k,0);
string part = p.substr(k, p.size());
int j = 0;
table[k][0] = 0;
for (int i = 1; i < part.size(); i++)
{
while (j > 0 && part[i] != part[j])
j = table[k][j - 1];
if (part[i] == part[j])
table[k][i] = ++j;
if (max < table[k][i])
max = table[k][i];
}
}
return max;
}
int main()
{
string p;
getline(cin, p);
printf("%d\n", maketable(p));
}
'Algorithm > BOJ(백준)' 카테고리의 다른 글
백준 2667 단지번호붙히기 (0) 2018.09.30 백준 7576 토마토 (0) 2018.09.30 백준 1697 숨바꼭질 (0) 2018.09.28 백준 4354 문자열 제곱 (1) 2018.09.06 백준 1305 광고 (0) 2018.09.06