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

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

틀렸습니다

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

요약
가로 단어와 세로 단어가 교차하는 칸에서 서로 다른 글자를 요구하지 않도록, 충돌을 없애기 위해 제거할 단어 수를 최소로 정한다.
난이도

보통10점 중 7점

유형
그래프, 유니온 파인드, 이분 탐색, 그리디
정답자
아직 제출이 없습니다

문제

승혁이는 크로스워드 퍼즐을 풀고 있다. 퍼즐판의 정해진 위치마다 가로 방향 또는 세로 방향으로 단어를 하나씩 적어 넣으려 한다. 그런데 어떤 가로 단어와 세로 단어가 같은 칸을 지날 때, 그 칸에 들어가야 하는 글자가 서로 다르면 두 단어는 충돌한다.

승혁이는 단어를 고치지 않고, 서로 충돌하는 단어 쌍이 하나도 없도록 단어들의 부분집합을 골라 배치하려 한다. 이때 배치할 수 있는 단어의 최대 개수를 구하여라.

같은 방향(가로끼리, 세로끼리)의 단어는 위치가 겹치지 않으므로 서로 충돌하지 않는다. 충돌은 오직 가로 단어와 세로 단어가 한 칸에서 만나 그 칸에 서로 다른 글자를 요구할 때에만 발생한다.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다.

  • 첫째 줄에 가로 단어의 개수 HH와 세로 단어의 개수 VV가 공백으로 구분되어 주어진다. (1≤H,V≤5001 \le H, V \le 500)
  • 이어지는 HH개의 줄에는 각 가로 단어의 시작 칸 좌표 xx, yy와 단어 WW가 주어진다. (0≤x,y≤10000 \le x, y \le 1000, 1≤∣W∣≤10001 \le |W| \le 1000)
  • 이어지는 VV개의 줄에는 각 세로 단어의 시작 칸 좌표 xx, yy와 단어 WW가 주어진다. (0≤x,y≤10000 \le x, y \le 1000, 1≤∣W∣≤10001 \le |W| \le 1000)

모든 단어는 알파벳 대문자로만 이루어진다. 가로 단어끼리 위치가 겹치거나 세로 단어끼리 위치가 겹치는 경우는 없다.

퍼즐판 가장 왼쪽 위 칸의 좌표는 x=y=0x = y = 0이다. xx는 가로(열) 위치, yy는 세로(행) 위치를 나타낸다. 가로 단어는 시작 칸에서 오른쪽(xx가 커지는 방향)으로, 세로 단어는 시작 칸에서 아래쪽(yy가 커지는 방향)으로 한 글자씩 채워진다. 따라서 시작 칸이 (x,y)(x, y)인 가로 단어의 kk번째 글자는 칸 (x+k,y)(x+k, y)에, 세로 단어의 kk번째 글자는 칸 (x,y+k)(x, y+k)에 놓인다 (단, kk는 0부터 센다).

출력

각 테스트 케이스마다, 서로 충돌하는 쌍이 하나도 없도록 배치할 수 있는 단어의 최대 개수를 한 줄에 출력한다.

예제3

  1. 예제 1

    입력
    2
    2 2
    0 1 BAPC
    0 2 LEIDEN
    0 0 SOLUTION
    2 1 WINNER
    1 4
    0 1 HELLO
    1 0 HI
    2 0 BYE
    3 0 GOODBYE
    4 0 FAREWELL
    
    예상 출력
    3
    4
    
  2. 예제 2

    입력
    1
    1 1
    0 0 A
    0 0 B
    
    예상 출력
    1
    
  3. 예제 3

    입력
    1
    1 1
    0 0 AB
    0 0 AC
    
    예상 출력
    2