만드는 중입니다

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

라벨이 붙은 경로

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

요약
간선 라벨이 문자열 A의 부분 문자열인 DAG에서, 시작 정점 s부터 각 정점까지 라벨이 사전순으로 가장 작은 경로를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 위상 정렬, 문자열 매칭, 그래프
정답자
아직 제출이 없습니다

문제

방향 비순환 그래프(DAG)가 주어진다. 정점은 nn개, 간선은 mm개이다. 각 간선에는 소문자로 이루어진 라벨이 붙어 있으며, 빈 문자열일 수도 있다. 경로의 라벨은 경로 순서대로 간선의 라벨을 이어 붙인 문자열이다. 시작 정점 ss에서 도착 정점 tt까지 가는 경로 중 라벨이 사전순으로 가장 작은 경로를 최소 경로라고 한다. 주어진 ss에 대해, 모든 정점 tt까지의 최소 경로를 구하라.

입력

첫 줄에 정수 nn, mm, dd, ss가 공백으로 구분되어 주어진다. dd는 아래에 나오는 문자열 AA의 길이이다. 정점은 1부터 nn까지 번호가 매겨져 있다.

둘째 줄에는 길이가 정확히 dd인 문자열 AA가 주어진다. 모든 문자는 영어 소문자이다. 간선의 라벨은 모두 AA의 부분 문자열이다.

이어지는 mm개의 줄 중 ii번째 줄에는 정수 uiu_i, viv_i, pip_i, ℓi\ell_i가 주어진다. ii번째 간선은 uiu_i에서 viv_i로 향하며, 라벨은 AA의 pip_i번째 문자부터 시작하는 길이 ℓi\ell_i인 부분 문자열이다. AA의 문자는 1부터 dd까지 번호가 매겨져 있다.

출력

nn개의 줄을 출력한다. tt번째 줄에는 ss에서 tt까지의 최소 경로를 출력한다. ss에서 tt로 가는 경로가 없으면 정수 0만 출력한다. 그렇지 않으면 경로의 정점 개수(ss와 tt 포함)를 먼저 쓰고, 경로 순서대로 정점 번호를 공백으로 구분해 출력한다. 해가 여러 개이면 그중 아무거나 출력해도 된다.

제한

  • 1≤s≤n≤6001 \le s \le n \le 600
  • 1≤m≤20001 \le m \le 2000
  • 1≤d≤1061 \le d \le 10^6
  • 1≤ui≤n1 \le u_i \le n, 1≤vi≤n1 \le v_i \le n, 모든 ii에 대해 ui≠viu_i \ne v_i
  • 1≤pi1 \le p_i, 0≤ℓi0 \le \ell_i, 모든 ii에 대해 pi+ℓi−1≤dp_i + \ell_i - 1 \le d
  • 그래프는 비순환이며 평행 간선이 없다. 즉, i≠ji \ne j이면 ui≠uju_i \ne u_j 또는 vi≠vjv_i \ne v_j이다.

힌트

이 예제에서 간선 3→13 \to 1의 라벨은 ab이고, 간선 1→41 \to 4의 라벨은 a이다. 3에서 4까지의 최소 경로는 3→1→43 \to 1 \to 4이며, 그 라벨은 aba이다.

예제1

  1. 예제 1

    입력
    5 7 6 3
    abcbca
    3 2 1 1
    2 1 5 1
    2 5 4 2
    3 1 1 2
    3 4 3 2
    1 4 6 1
    5 4 5 2
    
    예상 출력
    2 3 1
    2 3 2
    1 3
    3 3 1 4
    3 3 2 5