치환 암호 키 찾기

서로 다른 N개의 단어와 목표 순열이 주어질 때, 암호화한 단어들이 그 순서로 정렬되게 하는 사전순으로 가장 작은 치환 암호 키를 찾고, 없으면 NE를 출력한다.

어려움8그리디정렬문자열구현면접 대비아직 제출이 없습니다시간 제한1초메모리 제한64 MB

문제

미르코는 서로 다른 단어 NN개를 치환 암호로 암호화하려고 한다.

치환 암호에는 키가 필요하다. 키는 영어 소문자 26개를 한 번씩 사용해 만든 문자열이다. 암호화할 때는 단어에 있는 'a'를 모두 키의 첫 번째 글자로, 'b'를 모두 키의 두 번째 글자로 바꾸고, 같은 방식으로 'z'까지 바꾼다.

미르코에게는 배열 AA도 있다. AA11부터 NN까지의 수를 한 번씩 담은 순열이다. 미르코는 단어 NN개를 모두 암호화한 다음 사전순으로 정렬했을 때, 처음에 AiA_i번째에 있던 단어가 ii번째 자리에 오도록 하는 키를 원한다.

사전순은 사전에 단어가 실리는 순서다. 두 단어를 비교할 때는 왼쪽부터 글자를 훑어 서로 다른 첫 위치를 찾고, 그 자리의 글자가 더 작은 단어를 더 작다고 본다. 단어 XX가 단어 YY의 앞부분과 똑같다면 XXYY보다 작다.

미르코는 오늘 암호화할 마음이 없다. 대신 키를 구해 주자.

입력

첫째 줄에 정수 NN이 주어진다. (2N1002 \le N \le 100)

다음 NN개 줄에 단어가 한 개씩 주어진다. 단어는 영어 소문자로만 이루어지고 길이는 100100 이하다. 단어는 모두 서로 다르다.

마지막 줄에 배열 AA의 원소 NN개가 주어진다.

출력

조건을 만족하는 키가 없으면 NE를 출력한다.

키가 있으면 첫째 줄에 DA를 출력하고, 둘째 줄에 키를 출력한다. 키는 영어 소문자 26개가 한 번씩 나오는 문자열이다. 조건을 만족하는 키가 여러 개면 사전순으로 가장 앞서는 키를 출력한다.

힌트

첫 번째 예제에서 두 단어는 암호화하면 ba와 ac가 된다. 이를 사전순으로 정렬하면 ac, ba가 되므로 첫 번째 단어는 두 번째 자리로 가고 두 번째 단어는 첫 번째 자리로 간다.