만드는 중입니다

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

Jan

시간 제한1초메모리 제한128 MB

요약
소문자 단어를, 자기 자신을 제외한 모든 회전보다 사전순으로 앞서는 조각들로 최소 개수만큼 나누어 그 분할을 출력한다.
난이도

보통10점 중 6점

유형
문자열, 그리디, 문자열 매칭, 구현
정답자
아직 제출이 없습니다

문제

어린 시절의 야스(Jaś)는 예전에 여러분이 회문 문제 풀이를 함께 확인해 주었던 바로 그 아이인데, 이제 어른이 되어 그냥 얀(Jan)이라고 불립니다. 얀은 지금도 단어에 숨은 성질을 무척 좋아합니다.

어느 날 얀은 단어 adam에 흥미를 느꼈습니다. 이 단어는 어떤 방식으로 회전시켜도 사전식(lexicographic) 순서로 원래 단어보다 뒤에 오는 단어가 되기 때문입니다. 여기서 회전이란 단어 앞쪽의 몇 글자를 순서를 유지한 채 뒤로 옮기는 것을 뜻합니다. adam을 회전시킨 결과는 dama, amad, mada입니다.

얀은 이런 성질을 가진 단어를 얀의 단어라고 이름 붙였습니다(특히 한 글자짜리 단어는 모두 얀의 단어입니다). 예를 들어 aabab는 얀의 단어이지만 abab는 아닙니다(두 글자만큼 회전하면 다시 abab가 되어 원래 단어보다 뒤에 오지 않기 때문입니다). barak도 얀의 단어가 아닙니다(한 글자만큼 회전하면 arakb가 되어 원래 단어보다 앞에 오기 때문입니다).

얀은 다음과 같은 놀이를 생각해 냈습니다. 소문자 영어 알파벳으로 이루어진 단어를 하나 골라, 그것을 얀의 단어들로 나눕니다. 어떤 단어는 여러 방법으로 나눌 수 있습니다. 예를 들면

abaabab = ab+aab+ab = ab+aab+a+b = ab+aabab = ...

얀은 그중에서도 가능한 한 가장 적은 개수의 얀의 단어로 나누는 방법에만 관심이 있습니다.

얀의 단어를 입력받아 그것을 최소 개수의 얀의 단어로 나눈 결과를 출력하는 프로그램을 작성하세요.

입력

첫째 줄에 단어의 길이를 나타내는 정수 nn (1≤n≤10000001 \le n \le 1000000)이 주어집니다. 둘째 줄에는 길이가 정확히 nn인 단어 하나가 주어집니다. 이 단어는 공백이 없는 소문자 영어 알파벳 문자열입니다.

출력

한 줄에 다음을 출력합니다. 먼저 입력으로 주어진 단어를 출력하고, 그다음에 = 기호를, 이어서 최소 분할에 포함된 얀의 단어들을 + 기호로 구분하여 출력합니다. 입력 단어 자체가 얀의 단어라면 = 뒤에 그 단어를 한 번만 출력합니다. 출력에는 공백이 없어야 합니다. 최소 분할은 유일하므로 정답은 오직 하나뿐입니다.

예제5

  1. 예제 1

    입력
    7
    abaabab
    
    예상 출력
    abaabab=ab+aabab
    
  2. 예제 2

    입력
    4
    adam
    
    예상 출력
    adam=adam
    
  3. 예제 3

    입력
    5
    aabab
    
    예상 출력
    aabab=aabab
    
  4. 예제 4

    입력
    4
    abab
    
    예상 출력
    abab=ab+ab
    
  5. 예제 5

    입력
    5
    barak
    
    예상 출력
    barak=b+ar+ak