만드는 중입니다

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

긴 퍼즐

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

요약
퍼즐 조각의 부분집합 중 길이 합이 l이고, 테두리를 맞물려 양 끝이 직선인 한 부분을 만들 수 있는 집합의 수를 구합니다.
난이도

어려움10점 중 8점

유형
동적 계획법, 그래프, 조합론
정답자
아직 제출이 없습니다

문제

1차원 퍼즐이 있다. 퍼즐의 각 조각은 길이, 왼쪽 경계의 종류, 오른쪽 경계의 종류 세 값으로 나타낼 수 있다. 경계의 종류는 곧은 경계, 볼록한 경계, 오목한 경계 중 하나이다. 조각은 뒤집을 수 없으므로 왼쪽 경계와 오른쪽 경계를 바꿀 수 없다. 볼록한 경계는 오목한 경계와 모두 연결할 수 있고, 그 반대도 마찬가지이다. 곧은 경계끼리는 연결할 수 없다.

그림 1: 조각의 예

길이가 ll인 부분을 만들기 위해 여러 조각(하나일 수도 있다)을 차례로 연결하려고 한다. 부분의 왼쪽 경계와 오른쪽 경계는 곧아야 한다. 집합에 있는 모든 조각을 사용해 원하는 부분을 만들 수 있는 조각 집합의 수를 구하라. 수가 매우 클 수 있으므로 1 000 000 0071\,000\,000\,007로 나눈 나머지를 계산한다. 서로 다른 연결 방법의 수가 아니라 조각 집합의 수를 구해야 한다.

입력

첫째 줄에 정수 nn과 ll이 주어진다. nn은 조각의 수, ll은 원하는 부분의 길이이다 (1≤n≤3001 \le n \le 300, 1≤l≤3001 \le l \le 300).

다음 nn개의 줄에 조각의 설명이 주어진다. 각 줄에는 aia_i, bib_i, cic_i가 주어지며, 각각 조각의 길이, 왼쪽 경계의 종류, 오른쪽 경계의 종류이다 (1≤ai≤l1 \le a_i \le l; bi,ci∈{"in","out","none"}b_i, c_i \in \{\texttt{"in"}, \texttt{"out"}, \texttt{"none"}\}). 문자열 "in"은 오목한 경계, "out"은 볼록한 경계, "none"은 곧은 경계를 뜻한다.

출력

집합에 있는 모든 조각을 사용해 원하는 부분을 만들 수 있는 조각 집합의 수를 1 000 000 0071\,000\,000\,007로 나눈 나머지를 출력한다.

힌트

첫 번째 예제의 퍼즐 조각은 앞의 그림과 같다.

그림 2: 원하는 부분을 만들 수 있는 조각 집합

예제2

  1. 예제 1

    입력
    5 10
    1 out out
    6 none in
    10 none none
    4 out none
    3 in none
    
    예상 출력
    3
    
  2. 예제 2

    입력
    4 5
    1 none out
    1 in out
    2 in out
    1 in none
    
    예상 출력
    1