SOJ ONLINE JUDGE

문제 122

Lyndon 분해와 최소 회전

내 상태
미제출
난이도
122번 문제 난이도 보기
Platinum III
출제자
rlatjwls7882
시간 제한
3000 ms
메모리 제한
1024 MB
122번 문제 태그 보기
구현

길이가 $N$인 문자열 $S$와 길이가 $M$인 정수 수열 $A$가 주어진다. $S$의 인덱스는 $0$부터 $N-1$까지이고, $A$의 인덱스는 $0$부터 $M-1$까지이다.

길이가 $L$인 비어 있지 않은 문자열이 자신을 $1$칸부터 $L-1$칸까지 순환 이동한 모든 문자열보다 사전순으로 작으면 Lyndon 문자열이라고 한다. 다음 값을 구해 보자.

  • $S$를 사전순 비증가하는 Lyndon 문자열들로 분해한 결과
  • $S$의 사전순 최소 회전 시작 인덱스
  • $A$의 사전순 최소 회전 시작 인덱스

위 조건을 만족하는 Lyndon 문자열로의 분해는 유일하다. 최소 회전이 여러 개라면 가장 작은 시작 인덱스를 택한다.

입력

첫 번째 줄에 두 정수 $N$, $M$이 공백으로 구분되어 주어진다. $(0 \le N, M \le 200\,000)$

두 번째 줄에 알파벳 소문자로 이루어진 문자열 $S$가 주어진다.

세 번째 줄에 수열의 원소 $A_0, A_1, \cdots, A_{M-1}$이 공백으로 구분되어 주어진다. $(-10^9 \le A_i \le 10^9)$ 빈 문자열과 빈 수열도 한 줄을 차지한다. 입력 마지막에 연속한 빈 줄은 생략해도 된다.

출력

첫 번째 줄에 분해한 Lyndon 문자열의 개수와 각 문자열의 시작 인덱스를 공백으로 구분하여 출력한다. 시작 인덱스는 오름차순으로 출력한다.

두 번째 줄에 문자열의 최소 회전 시작 인덱스를 출력한다. 세 번째 줄에 정수 수열의 최소 회전 시작 인덱스를 출력한다.

문자열이나 수열의 길이가 $0$이면 그 최소 회전 시작 인덱스로 $0$을 출력한다.

예제 입력 1

4 4
baca
3 1 2 1

예제 출력 1

3 0 1 3
3
1

제출

편집기에서 나가려면 Esc를 누른 뒤 Tab 또는 Shift와 Tab을 누르세요.