만드는 중입니다

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

반복 부분열 테스트

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

요약
문자열과 최대 10^6개의 생성된 부분 문자열 질의가 주어질 때, 각 부분 문자열의 서로 다른 부분 수열 개수를 10^9+7로 나눈 나머지로 구하고 마지막 값을 출력합니다.
난이도

어려움10점 중 8점

유형
문자열, 누적 합, 동적 계획법, 분할 정복
정답자
아직 제출이 없습니다

문제

어떤 문자열의 부분열(subsequence)은 문자열에서 몇몇 문자를 지웠을 때 얻어지는 문자열이다. 아무 문자도 지우지 않아도 되고, 모두 지워도 된다. 예를 들어 "ababA"의 서로 다른 부분열은 ""(빈 문자열), "a", "b", "A", "ab", "aa", "aA", "ba", "bb", "bA", "aba", "abb", "abA", "aab", "aaA", "bab", "baA", "bbA", "abab", "abaA", "abbA", "aabA", "babA", "ababA"로 총 2424개이다. 이 문제에서는 대소문자를 구별한다.

길이가 NN인 문자열 SS가 주어진다. 이 문자열의 연속한 부분문자열 QQ개에 대해 각각 서로 다른 부분열의 개수를 구하는 프로그램을 작성하라.

입력을 받는 시간을 줄이기 위해 다음과 같은 의사 난수 생성기(PseudoRandom Generator)를 사용한다. a0a_0, b0b_0, pp, qq, rr이 주어지면 i≥1i \geq 1일 때 aia_i, bib_i, xix_i, yiy_i, ziz_i는 다음과 같이 정의된다. 먼저 z0=0z_0 = 0, X=109+7X = 10^9 + 7이라고 하자.

ai=(p⋅ai−1+q⋅bi−1+zi−1+r) mod Xa_i = (p \cdot a_{i-1} + q \cdot b_{i-1} + z_{i-1} + r) \bmod X bi=(p⋅bi−1+q⋅ai−1+zi−1+r) mod Xb_i = (p \cdot b_{i-1} + q \cdot a_{i-1} + z_{i-1} + r) \bmod X xi=min⁡(ai mod n,bi mod n)+1x_i = \min(a_i \bmod n, b_i \bmod n) + 1 yi=max⁡(ai mod n,bi mod n)+1y_i = \max(a_i \bmod n, b_i \bmod n) + 1 zi=(cxicxi+1…cyi−1cyi의 서로 다른 부분열의 개수) mod Xz_i = (c_{x_i} c_{x_i+1} \ldots c_{y_i-1} c_{y_i}\text{의 서로 다른 부분열의 개수}) \bmod X

u mod vu \bmod v는 uu를 vv로 나눈 나머지를 의미한다. 난수를 생성하는 방식 자체에는 의미가 없으며, 어떤 입력이 주어져도 제한 시간 안에 정답을 출력하는 알고리즘이 존재한다.

zQz_Q를 구해보자.

입력

첫 번째 줄에 문자열 SS가 주어진다. 이 문자열의 길이 NN은 11 이상 10610^6 이하이며, SS는 알파벳 대문자와 소문자로만 이루어져 있다.

두 번째 줄에는 6개의 정수 QQ, a0a_0, b0b_0, pp, qq, rr이 공백 하나로 구분되어 주어진다. 1≤Q≤1061 \leq Q \leq 10^6을 만족하며, 0≤a0,b0,p,q,r<X=109+70 \leq a_0, b_0, p, q, r < X = 10^9 + 7을 만족한다.

출력

첫째 줄에 zQz_Q를 출력한다.

예제1

  1. 예제 1

    입력
    ababA
    2 4 6 8 10 12
    
    예상 출력
    7