만드는 중입니다

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

잉크를 엎질렀다

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

요약
숨겨진 글자(#)가 있는 문자열과 Z 배열이 주어졌을 때, 둘을 모두 만족하는 문자열을 복원하거나 그런 문자열이 없음을 판별합니다.
난이도

보통10점 중 7점

유형
문자열, 유니온 파인드, 문자열 매칭
정답자
아직 제출이 없습니다

문제

디디는 알파벳 대문자(A-Z)로 구성된 문자열 SS에 대해, S[1∼N]S[1 \sim N]과 SS의 부분 문자열 S[i∼N]S[i \sim N]의 가장 긴 공통 접두사의 길이를 ZiZ_i라고 정의했다. 디디는 오랜 공부 끝에 찾은 알고리즘으로 이 값들로 이루어진 배열 ZZ를 완성했다. 그런데 기쁨에 겨워 춤을 추다가 문자열 SS의 일부에 잉크를 엎질렀고, 그 바람에 자신이 만든 배열 ZZ가 올바른지 확인할 수 없게 되었다.

착한 ryute는 절망에 빠진 디디를 돕고자 한다. 일부 문자가 가려진 문자열 S′S'와 디디가 작성한 배열 ZZ를 이용해 원본 문자열 SS를 복원한다. 또한 디디가 만든 배열 ZZ가 올바른지도 확인한다. 원본 문자열 SS로 가능한 경우가 하나라도 있다면 배열 ZZ는 올바른 것으로 간주하고, 그렇지 않다면 올바르지 않은 것으로 간주한다. ryute를 따라 디디를 도와주자.

입력

첫째 줄에 문자열 SS의 길이 NN이 주어진다. (1≤N≤1051 \le N \le 10^5)

둘째 줄에 문자열 S′S'가 주어진다. S′S'는 알파벳 대문자(A-Z)와 #으로 구성되어 있다. #은 해당 글자가 잉크에 가려졌다는 뜻이며, #의 개수는 20개를 넘지 않는다.

셋째 줄에 디디가 작성한 배열 ZZ의 원소 ZiZ_i(0≤Zi≤N−i+10 \le Z_i \le N-i+1)가 순서대로 공백으로 구분되어 주어진다.

출력

디디가 만든 배열 ZZ가 올바르지 않다면 THINKINGFACE를 출력한다. 그렇지 않다면 첫째 줄에 YES, 둘째 줄에 원본 문자열 SS를 출력한다. SS로 가능한 문자열이 여러 개라면 그중 하나를 출력한다.

예제3

  1. 예제 1

    입력
    7
    ABAB#CD
    7 0 3 0 1 0 0
    
    예상 출력
    YES
    ABABACD
    
  2. 예제 2

    입력
    7
    ABAB#CD
    7 0 3 0 0 0 0
    
    예상 출력
    THINKINGFACE
    
  3. 예제 3

    입력
    27
    #ABCDEFGHIJKLMNOPQRSTUVWXYZ
    27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    
    예상 출력
    THINKINGFACE