만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

회문 길이

시간 제한0.5초메모리 제한2048 MB

요약
소문자로 이루어진 최대 100,000자 문자열을 회문인 부분 문자열들로 겹치지 않게 나눌 때, 필요한 최소 개수를 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 문자열, 문자열 매칭
정답자
아직 제출이 없습니다

문제

어떤 문자열을 앞에서 읽든 뒤에서 읽든 같으면 회문이라고 한다. 회문은 문자열의 비대칭성처럼 복잡도를 재는 데 쓸모가 있다.

길이가 nn인 문자열 SS의 비대칭성은 회문 길이 PL(S)PL(S)로 잴 수 있다. PL(S)PL(S)는 SS를 회문인 부분 문자열들로 나눌 때 필요한 최소 개수이다. 정확히 말하면, PL(S)PL(S)는 1≤t≤n1 \le t \le n을 만족하는 최소의 정수 tt로, 회문인 부분 문자열 S1,S2,…,StS_1, S_2, \dots, S_t가 존재해서 이들을 이어 붙인 S1S2⋯StS_1 S_2 \cdots S_t가 SS와 같아야 한다. SS를 S1,S2,…,StS_1, S_2, \dots, S_t로 나눈 것은 S1S_1 | S2S_2 | ⋯\cdots | StS_t로 표기한다.

예를 들어 abaaca는 aba | aca로 두 회문으로 나눌 수 있고 이것이 최소이므로, abaaca의 경우 PL(S)=2PL(S) = 2이다. acaba는 두 회문으로 나눌 수 없지만 aca | b | a나 a | c | aba처럼 세 개로 나눌 수 있으므로, acaba의 경우 PL(S)=3PL(S) = 3이다. radar는 그 자체로 회문이므로 PL(S)=1PL(S) = 1이다. abcde의 경우 PL(S)=5PL(S) = 5이다.

입력

첫 줄에 양의 정수 nn (1≤n≤100 0001 \le n \le 100\,000)이 주어진다. nn은 문자열의 글자 수이다. 다음 줄에는 영문 소문자 nn개로 이루어진 문자열이 주어진다. 글자 사이에는 공백이 없다.

출력

입력된 문자열 SS의 회문 길이 PL(S)PL(S)를 한 줄에 출력한다. 이 값은 양의 정수이다.

예제4

  1. 예제 1

    입력
    6
    abaaca
    
    예상 출력
    2
    
  2. 예제 2

    입력
    5
    acaba
    
    예상 출력
    3
    
  3. 예제 3

    입력
    5
    abcde
    
    예상 출력
    5
    
  4. 예제 4

    입력
    5
    radar
    
    예상 출력
    1