부분 문자열 순열

면접 대비

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

요약
문자열 S와 P가 주어집니다. P의 어떤 순열이 S의 어떤 순열의 부분 문자열이 될 수 있는지 판단합니다.
난이도

보통10점 중 6점

유형
해시맵, 투 포인터, 배열
정답자
아직 제출이 없습니다

문제

두 문자열 SS와 PP가 주어졌을 때, PP가 SS의 부분 문자열로 나타나는지 판별하는 방법은 여러 가지가 있다. 가장 단순한 방법은 PP가 SS의 모든 부분 문자열과 같은지 직접 확인하는 것이다. 길이가 ∣P∣|P|인 SS의 부분 문자열은 O(∣S∣)O(|S|)개 존재할 수 있으므로 이 방법의 시간 복잡도는 O(∣S∣×∣P∣)O(|S| \times |P|)이다. KMP(Knuth-Morris-Pratt) 알고리즘을 사용하면 O(∣S∣+∣P∣)O(|S| + |P|)에 해결할 수도 있다.

이 문제에서는 이와 비슷한 문제를 다룬다.

두 문자열 SS와 PP가 주어진다. Π(S)\Pi(S)를 SS의 순열(permutation)인 모든 문자열의 집합, Π(P)\Pi(P)를 PP의 순열인 모든 문자열의 집합이라고 하자. Π(P)\Pi(P)의 원소 pp와 Π(S)\Pi(S)의 원소 ss 중에서 pp가 ss의 부분 문자열로 나타나는 쌍이 존재하는지 판별하라.

예를 들어 S=guruS = \text{guru}, P=rugP = \text{rug}라고 하자. 그러면 Π(S)={gruu,guru,guur,rguu,rugu,ruug,ugru,ugur,urgu,urug,uugr,uurg}\Pi(S) = \{\text{gruu}, \text{guru}, \text{guur}, \text{rguu}, \text{rugu}, \text{ruug}, \text{ugru}, \text{ugur}, \text{urgu}, \text{urug}, \text{uugr}, \text{uurg}\}이고, Π(P)={gru,gur,rgu,rug,ugr,urg}\Pi(P) = \{\text{gru}, \text{gur}, \text{rgu}, \text{rug}, \text{ugr}, \text{urg}\}이다. Π(P)\Pi(P)의 문자열 rug\text{rug}가 Π(S)\Pi(S)의 문자열 rugu\text{rugu}의 부분 문자열로 나타나는 것을 확인할 수 있다. 즉 [rug]u[\text{rug}]\text{u}이다. 이 예에서는 ⟨gru,gruu⟩\langle\text{gru}, \text{gruu}\rangle, ⟨gru,ugru⟩\langle\text{gru}, \text{ugru}\rangle, ⟨urg,uurg⟩\langle\text{urg}, \text{uurg}\rangle, ⟨gur,guru⟩\langle\text{gur}, \text{guru}\rangle 등 조건을 만족하는 다른 쌍도 찾을 수 있다.

입력

입력은 두 줄로 이루어진다. 첫 번째 줄에는 문자열 SS가 주어진다 (1≤∣S∣≤1000001 \le |S| \le 100000). 두 번째 줄에는 문자열 PP가 주어진다 (1≤∣P∣≤∣S∣≤1000001 \le |P| \le |S| \le 100000). SS와 PP는 모두 알파벳 소문자(a-z)로만 이루어져 있다.

출력

Π(P)\Pi(P)의 원소 pp와 Π(S)\Pi(S)의 원소 ss 중에서 pp가 ss의 부분 문자열로 나타나는 쌍이 존재하면 “YES”를, 존재하지 않으면 “NO”를 큰따옴표 없이 한 줄에 출력한다.

예제4

  1. 예제 1

    입력
    guru
    rug
    
    예상 출력
    YES
    
  2. 예제 2

    입력
    icpc
    inc
    
    예상 출력
    NO
    
  3. 예제 3

    입력
    yesorno
    sore
    
    예상 출력
    YES
    
  4. 예제 4

    입력
    indonesia
    icpcasia
    
    예상 출력
    NO