Append — 부호열 분할 개수
시간 제한1초메모리 제한128 MB
LZ 방식으로 인코딩된 (뒤 참조 거리, 길이) 쌍의 목록이 주어질 때, 원래 문자열을 재현하는 두 개의 비어 있지 않은 유효한 인코딩으로 나뉘는 분할 지점의 수를 센다.
문제
잘 알려진 압축 알고리즘에서 쓰이는 부호화 방식을 생각하자. 소문자 알파벳으로만 이루어진 문자열을 부호화한다. 이러한 문자열은 쌍 들의 나열로 부호화되며, 은 정수이고 는 일 때는 하나의 문자, 일 때는 를 만족하는 정수이다.
복호화는 쌍을 순서대로 처리하면서 결과 문자열을 만들어 간다.
- 이면 는 문자이며, 지금까지 복호화된 문자열의 끝에 그 문자를 덧붙인다.
- 이면 는 인 정수이며, 지금까지 복호화된 문자열의 현재 끝에서 칸 앞의 위치부터 시작해 개의 문자를 복사하여 끝에 덧붙인다.
예를 들어 쌍 는 다음과 같이 복호화된다. 로 a, 로 aa, 로 aab, 은 aab 를 덧붙여 aabaab, 다음 은 다시 aab 를 덧붙여 aabaabaab, 는 aa 를 덧붙여 aabaabaabaa, 마지막으로 로 aabaabaabaac 가 된다. 하나의 문자열 에 대해 서로 다른 부호가 여러 개 존재할 수 있음에 유의하라.
두 문자열 , 에 대해 는 이들을 이어 붙인 문자열을 뜻한다. 를 소문자 문자열 의 한 부호라고 하자. 주어진 부호 를 앞뒤로 이어지는 두 부분 로 나누는 방법이 몇 가지인지 세어라. 단,
- 는 앞쪽 몇 개의 쌍으로 이루어진 접두부이고, 는 나머지 접미부이다.
- 자체가 어떤 문자열 의 올바른 부호이고, 자체도 어떤 문자열 의 올바른 부호이다.
- 이며 와 는 모두 비어 있지 않다.
이 개수를 출력하는 프로그램을 작성하라.
입력
입력은 여러 개의 블록으로 이루어진다. 각 블록은 하나의 부호 를 나타낸다. 블록의 각 줄은 공백 하나로 구분된 두 정수 , () 이거나, 정수 뒤에 공백 하나와 소문자 하나가 오는 형태이다. 각 블록은 빈 줄 하나로 끝난다. 입력에는 이러한 블록이 여러 개 연달아 주어질 수 있다.
출력
각 블록마다 한 줄에, 부호 를 이고 , 가 모두 비어 있지 않으며 두 부분이 각각 그 자체로 올바른 부호가 되도록 로 나누는 방법의 수를 출력한다.