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

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

Sgame

시간 제한4초메모리 제한1024 MB

요약
문자열과 여러 개의 질의 (m, k)가 주어질 때, 길이가 m에서 k 사이이고 같은 횟수를 유지하며 양쪽으로 늘릴 수 없는 부분 문자열의 최대 등장 횟수를 구합니다.
난이도

어려움10점 중 9점

유형
문자열, 정렬, 세그먼트 트리, 트라이
정답자
아직 제출이 없습니다

문제

슈멘 국제 대회가 IATI로 바뀐 지 3주년을 기념하여 주최 측이 새로운 게임을 준비했다. 데니도 이 게임에 참가하기로 했다. 그녀는 게임이 올라와 있는 태블릿 앞으로 갔다. 태블릿에는 길이가 N이고 소문자 라틴 문자로만 이루어진 문자열 w가 있었다.

게임은 Q라운드로 진행된다. 각 라운드에서 플레이어는 길이 m을 정한다. 길이가 m 이상인 모든 부분 문자열 가운데 가장 많이 나타나는 부분 문자열 s를 찾는다. 이 라운드의 점수는 s가 w에서 나타나는 횟수 cnt이다. 게임을 더 흥미롭게 하려고 플레이어는 k ≥ m인 길이 k도 함께 정한다. 찾은 s의 길이는 k를 넘으면 안 된다. 또한 s의 왼쪽이나 오른쪽에 문자를 붙여 길이가 k보다 길면서 cnt 이상 나타나는 문자열을 만들 수 있으면 안 된다. 다시 말해 s의 길이는 m 이상 k 이하이고, 어떤 부분 문자열 t에 대해서든 ts와 st 중 길이가 k보다 긴 문자열은 w에서 cnt번보다 적게 나타나야 한다. 그런 s가 없으면 이 라운드의 점수는 0이다.

함수

start() 함수는 태블릿에 올라온 문자열을 받는다. 그 뒤 심사 프로그램이 두 정수 m과 k를 인자로 round() 함수를 Q번 호출한다. round()는 각 라운드마다 찾는 부분 문자열의 최대 나타남 횟수를 반환하고, 조건을 만족하는 부분 문자열이 없으면 0을 반환한다.

제한

1≤N≤5⋅1051 \le N \le 5 \cdot 10^5

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

예제1

  1. 예제 1

    입력
    1
    a
    1
    1 1
    
    예상 출력
    1