알고리즘 가속
시간 제한8초메모리 제한128 MB
두 수열에 대해 값 집합이 달라지는 가장 긴 접두사와 접미사를 재귀적으로 잘라내는 불리언 함수 F의 값을 구한다.
문제
바이트아사르(Byteasar)는 벌로, 두 양의 정수 수열 과 에 대해 정의된 불(boolean) 함수 를 계산해야 한다. 함수는 다음과 같이 정의된다.
boolean F(x, y)
if W(x) != W(y): return 0
else if |W(x)| = |W(y)| = 1: return 1
else: return F(p(x), p(y)) AND F(s(x), s(y))
여기서 각 기호의 뜻은 다음과 같다.
- 는 수열 에 나타나는 값들의 집합이다. (원소의 순서와 중복은 무시한다.)
- 는 를 만족하는 의 가장 긴 접두사(앞에서부터 잘라낸 임의 길이의 부분)이다.
- 는 를 만족하는 의 가장 긴 접미사(뒤에서부터 잘라낸 임의 길이의 부분)이다.
- 는 논리곱(AND), 은 참, 은 거짓, 는 집합 의 원소 개수를 뜻한다.
예를 들어 이면 , , 이다.
정의를 그대로 따라 를 계산하면 큰 입력에서는 터무니없이 느리므로, 최대한 빠르게 계산해야 한다. 여러 개의 수열 쌍 를 읽어, 각 쌍에 대한 의 값을 출력하여라.
입력
첫째 줄에 분석할 수열 쌍의 개수 () 가 주어진다. 이어지는 개의 줄에 각 쌍의 정보가 주어진다. 각 쌍마다 첫째 줄에는 두 수열 와 의 길이 과 () 이 공백으로 구분되어 주어진다. 둘째 줄에는 수열 를 이루는 개의 정수 () 가, 셋째 줄에는 수열 를 이루는 개의 정수 () 가 각각 공백으로 구분되어 주어진다.
출력
정확히 개의 줄을 출력한다. 번째 줄 () 에는 번째 쌍에 대한 의 값인 또는 을 출력한다.