반복 부분열 테스트
시간 제한2초메모리 제한512 MB
문자열과 최대 10^6개의 생성된 부분 문자열 질의가 주어질 때, 각 부분 문자열의 서로 다른 부분 수열 개수를 10^9+7로 나눈 나머지로 구하고 마지막 값을 출력합니다.
문제
어떤 문자열의 부분열(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"로 총 개이다. 이 문제에서는 대소문자를 구별한다.
길이가 인 문자열 가 주어진다. 이 문자열의 연속한 부분문자열 개에 대해 각각 서로 다른 부분열의 개수를 구하는 프로그램을 작성하라.
입력을 받는 시간을 줄이기 위해 다음과 같은 의사 난수 생성기(PseudoRandom Generator)를 사용한다. , , , , 이 주어지면 일 때 , , , , 는 다음과 같이 정의된다. 먼저 , 이라고 하자.
는 를 로 나눈 나머지를 의미한다. 난수를 생성하는 방식 자체에는 의미가 없으며, 어떤 입력이 주어져도 제한 시간 안에 정답을 출력하는 알고리즘이 존재한다.
를 구해보자.
입력
첫 번째 줄에 문자열 가 주어진다. 이 문자열의 길이 은 이상 이하이며, 는 알파벳 대문자와 소문자로만 이루어져 있다.
두 번째 줄에는 6개의 정수 , , , , , 이 공백 하나로 구분되어 주어진다. 을 만족하며, 을 만족한다.
출력
첫째 줄에 를 출력한다.