아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

문자열 - 그래프 매칭

시간 제한2초메모리 제한1024 MB

요약
26개 알파벳 정점 위의 방향 그래프와 문자열 T가 주어졌을 때, 인접한 문자쌍들이 만드는 그래프가 주어진 그래프와 같은 T의 부분 문자열 개수를 구한다.
난이도

보통10점 중 7점

유형
문자열, 슬라이딩 윈도우, 그래프, 해시맵
정답자
아직 제출이 없습니다

문제

다음과 같은 방식으로 알파벳 소문자로 이루어진 문자열을 이용해 그래프를 만들 수 있다.

  1. 알파벳 소문자 a부터 z까지에 대응되는 정점을 만든다.
  2. 길이가 LL인 문자열 SS를 S_1S_2S_3⋯S_LS\_1S\_2S\_3\cdots S\_L로 나타냈을 때, L−1L-1 이하인 모든 양의 정수 ii에 대해 S_i→S_i+1S\_i \to S\_{i+1}인 간선을 그래프에 추가한다. 이때 같은 간선이 여러 개일 경우 한 개만 추가한다.

알파벳 소문자에 대응되는 정점들로 이루어진 그래프와 문자열 TT가 주어졌을 때, 위 변환 과정을 통해 주어진 그래프와 동일한 그래프가 만들어지는 TT의 부분 문자열의 개수를 구하시오.

여기서 부분 문자열이란, 문자열의 앞뒤에서 원하는 길이만큼 잘라서 얻을 수 있는 길이 11 이상의 문자열을 의미한다. 예를 들어 abcde라는 문자열이 있을 때, cd나 abc는 부분 문자열이지만, bd는 문자열의 앞 뒤에서 어떤 길이로 잘라내도 얻어낼 수 없으므로 부분 문자열이 아니다.

입력

첫 번째 줄에 문자열의 길이를 나타내는 정수 NN이 주어진다. (2≤N≤2,000,000)(2 \le N \le 2\\, 000\\,000)

두 번째 줄에 문자열 TT가 주어진다. TT는 알파벳 소문자로만 이루어진 길이 NN짜리 문자열이다.

세 번째 줄에 그래프의 간선 개수를 나타내는 정수 MM이 주어진다. (1≤M≤262)(1 \le M \le 26^2)

네 번째 줄부터 (M+3)(M + 3)번째 줄까지 그래프의 간선을 나타내는 알파벳 소문자 22개가 공백 없이 주어진다.

1≤i≤M1 \le i \le M인 ii에 대해 (i+3)(i + 3)번째 줄에 x_iy_ix\_iy\_i가 입력으로 주어졌다면 이는 x_i→y_ix\_i \to y\_i인 간선을 의미한다. x_ix\_i와 y_iy\_i는 같은 문자일 수 있으며, 같은 간선이 여러 번 주어지지 않는다. 주어지는 간선은 방향이 있는 간선임에 유의한다.

출력

첫 번째 줄에 지문에서 언급된 그래프 변환 과정을 거쳤을 때 동일한 그래프가 만들어지는 문자열 TT의 부분 문자열의 개수를 출력한다.

예제2

  1. 예제 1

    입력
    10
    raararaara
    3
    ra
    aa
    ar
    
    예상 출력
    25
    
  2. 예제 2

    입력
    10
    raararaara
    2
    ra
    ar
    
    예상 출력
    7