패턴으로 검색하기
면접 대비시간 제한2초메모리 제한128 MB
리터럴 문자, 와일드카드, 허용/금지 문자 그룹으로 이루어진 패턴을 해석해서 긴 텍스트에서 일치하는 모든 위치를 찾는 문제입니다.
문제
패턴 와 텍스트 가 주어진다. 둘 다 라틴 문자(소문자와 대문자)로만 이루어져 있다. 패턴에는 추가로 ?, [, ], {, } 문자가 들어갈 수 있다. 가 에 나타나는 모든 위치를 찾아야 한다.
패턴 의 각 위치는 다음 중 하나이다.
- 라틴 문자(
a–z,A–Z): 정확히 그 문자와 일치한다. - 문자
?: 임의의 문자 하나와 일치한다. - 그룹
[...]: 이 위치에 올 수 있는 문자들의 집합을 나열한다. - 그룹
{...}: 이 위치에 올 수 없는 문자들의 집합을 나열한다(그 외의 문자는 모두 허용된다).
그룹 안에서 문자는 [asssa]나 {kLLf}처럼 중복될 수 있다. 대소문자는 구분한다.
예를 들어 패턴이 A?[bcCc]{De}라면, 일치의 첫 번째 문자는 반드시 A, 두 번째는 임의의 라틴 문자, 세 번째는 b, c, C 중 하나, 네 번째는 D와 e를 제외한 임의의 라틴 문자여야 한다.
입력
첫 줄에 테스트 케이스의 수 이 주어진다. 각 테스트 케이스는 두 줄로 이루어진다. 첫 줄에는 패턴 (문자 개 이하, 위치 개 이하)가, 둘째 줄에는 텍스트 (문자 개 이하)가 주어진다.
출력
각 테스트 케이스마다, 패턴이 일치하는 텍스트의 모든 위치를 오름차순으로 한 줄에 출력한다(의 첫 문자의 위치는 이다). 위치 사이에는 공백 하나만 넣고, 줄의 처음이나 끝에 불필요한 공백을 두지 않는다. 가 에 나타나지 않으면 대신 no match를 출력한다.