만드는 중입니다

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

문자열 문제

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

요약
각 질의마다 부분 문자열에서 포인터가 순환하며 모든 문자를 정렬된 순서로 가져올 때 필요한 두 번째 종류 연산의 횟수를 구합니다.
난이도

어려움10점 중 8점

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

문제

Jonathan은 큰 세상의 재미있는 것들을 많이 알고 있다. 오늘 그는 Mavis에게 다음 문제를 냈다. 아마 어떤 정보올림피아드에서 봤거나 다른 곳에서 알았을 것이다.

문자열과, 처음에는 첫 번째 문자를 가리키는 포인터가 있다. 두 가지 연산을 쓸 수 있다.

  1. 현재 위치의 문자를 답 문자열 끝에 덧붙인다. 이 위치의 문자를 전에 가져간 적이 없어야 한다. 가져가도 원래 문자는 그 위치에 그대로 남는다.
  2. 포인터를 오른쪽으로 한 문자 옮긴다. 현재 문자가 마지막 문자라면 포인터는 문자열의 첫 번째 문자로 돌아간다.

일정 횟수의 연산을 수행한 뒤에는 모든 문자를 가져가야 하고, 답 문자열의 문자가 비내림차순으로 정렬되어 있어야 한다.

예를 들어 문자열이 hello라면 다음과 같이 연산할 수 있다.

  1. 두 번째 연산. 포인터를 문자 <<e>>로 옮긴다.
  2. 첫 번째 연산. 문자 <<e>>를 가져간다.
  3. 두 번째 연산. 포인터를 <<l>>로 옮긴다.
  4. 두 번째 연산. 포인터가 <<l>>을 가리킨다.
  5. 두 번째 연산. 포인터를 <<o>>로 옮긴다.
  6. 두 번째 연산. 포인터가 문자열의 첫 번째 문자 <<h>>를 가리킨다.
  7. 첫 번째 연산. <<h>>를 가져간다. 답 문자열은 <<eh>>가 된다.
  8. 두 번째 연산. 포인터가 이미 가져간 <<e>>를 가리킨다.
  9. 두 번째 연산.
  10. 첫 번째 연산. 답은 <<ehl>>이다.
  11. 두 번째 연산.
  12. 첫 번째 연산. 답은 <<ehll>>이다.
  13. 두 번째 연산.
  14. 첫 번째 연산. 답은 <<ehllo>>이다.

따라서 첫 번째 종류의 연산을 55번, 두 번째 종류의 연산을 99번 수행했다.

이 문제를 일반적인 경우로 조금 바꾼 버전을 풀어야 한다.

입력

첫 번째 줄에 소문자 라틴 문자로 이루어진 문자열 ss (1≤∣s∣≤1051 \le |s| \le 10^5)가 주어진다. 두 번째 줄에는 질의의 개수 mm (1≤m≤1051 \le m \le 10^5)이 주어진다. 이어지는 mm개의 줄에는 각각 질의의 경계 lil_i와 rir_i가 두 정수로 주어진다.

출력

각 질의에 대해, ss의 lil_i번째 위치부터 rir_i번째 위치까지(양 끝 포함) 부분 문자열에서 문제를 풀기 위해 수행해야 하는 두 번째 종류의 연산 횟수를 출력한다.

예제2

  1. 예제 1

    입력
    hello
    3
    1 5
    1 2
    2 5
    
    예상 출력
    9
    2
    3
    
  2. 예제 2

    입력
    fedcba
    1
    1 6
    
    예상 출력
    30