아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

반복 문자열

시간 제한10초메모리 제한512 MB

요약
길이가 최대 10^6인 소문자 문자열에서 각 질의 구간 안의 가장 긴 제곱 문자열 tt의 길이와 가장 왼쪽 시작 위치를 구합니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 분할 정복, 문자열
정답자
아직 제출이 없습니다

문제

밥은 야심 찬 아방가르드 작가다. 그는 띄어쓰기, 문장부호, 대문자 같은 것을 쓰지 않는다. 그래서 그의 이야기는 영어 소문자로만 이루어진 긴 문자열이다. 비평가들은 그가 반복을 좋아한다고 지적했다. 반복이란 같은 부분 문자열이 사이에 다른 문자 없이 두 번 연달아 나타나는 것을 뜻한다. 밥은 길이가 nn인 최신작 문자열을 qq곳의 문예지에 투고했다. 편집자들은 모두 그 일부(부분 문자열)를 싣겠다고 했지만, 그 부분 안에서 가장 긴 반복을 찾아 달라는 조건을 붙였다. 편집자들은 이야기가 지루해지지 않도록 그 부분을 잘라낼 예정이다. 밥은 이 질문들에 답하도록 도움이 필요하다.

길이가 nn인 문자열 s[1]s[2]…s[n]s[1]s[2]\dots s[n]이 주어졌을 때, qq개의 질의에 답하라. 각 질의는 aia_i와 bib_i로 주어진다. s[ai]s[ai+1]…s[bi]s[a_i]s[a_i+1]\dots s[b_i]의 부분 문자열로 tttt가 나타나는 가장 긴 문자열 tt의 길이와, 그런 가장 왼쪽 등장이 시작되는 위치를 구하라.

입력

첫째 줄에 두 정수 nn과 qq가 주어진다. 둘째 줄에는 길이가 nn인 문자열 ss가 주어지며, 모든 문자는 영어 소문자이다. 이어지는 qq개의 줄에는 각각 정수 aia_i와 bib_i가 공백으로 구분되어 주어진다.

출력

qq개의 줄을 출력한다. ii번째 줄에는 공백으로 구분된 두 정수 ℓi\ell_i와 cic_i를 출력한다. ℓi\ell_i는 s[ai]…s[bi]s[a_i]\dots s[b_i]의 부분 문자열로 tttt가 나타나는 가장 긴 tt의 길이이다. cic_i는 그 길이의 반복이 시작하는 가장 작은 인덱스이며, ai≤cia_i \le c_i, ci+2ℓi−1≤bic_i + 2\ell_i - 1 \le b_i, s[ci]…s[ci+ℓi−1]=s[ci+ℓi]…s[ci+2ℓi−1]s[c_i]\dots s[c_i+\ell_i-1] = s[c_i+\ell_i]\dots s[c_i+2\ell_i-1]을 만족한다. ℓi=0\ell_i = 0이면 정의에 따라 ci=aic_i = a_i이다.

제한

1≤n≤1061 \le n \le 10^6

1≤q≤1001 \le q \le 100

각 i=1,2,…,qi = 1, 2, \dots, q에 대해 1≤ai≤bi≤n1 \le a_i \le b_i \le n

힌트

위 예제의 네 질의는 각각 aabaa, cabaabaac, abaac, aca 부분 문자열을 가리킨다. 굵은 부분이 각 질의 결과에 해당하는 부분 문자열로, 인덱스 cic_i에서 시작하는 길이 ℓi\ell_i의 문자열이다. 마지막 질의에는 반복이 없으므로 ℓ4=0\ell_4 = 0이다.

예제1

  1. 예제 1

    입력
    10 4
    cabaabaaca
    4 8
    1 9
    5 9
    8 10
    
    예상 출력
    1 4
    3 2
    1 7
    0 8