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

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

로봇 게임

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

요약
모든 로봇이 폭발하지 않고 목표 출력을 만드는 시작 칸이 하나라도 있는 입력과 출력 조합의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
비트 연산, 동적 계획법, 시뮬레이션
정답자
아직 제출이 없습니다

문제

(참고: 대회 제한 시간은 3초였습니다. 더 많은 풀이가 통과할 수 있도록 여기서는 더 큰 제한 시간을 설정했습니다.)

mm 대 (1≤m≤10001 \le m \le 1000)의 로봇과 mm 개의 테이프가 있습니다. ii 번째 로봇 (1≤i≤m1 \le i \le m)은 테이프 ii 를 다룹니다. 각 테이프는 왼쪽에서 오른쪽으로 nn 개 (1≤n≤321 \le n \le 32)의 칸으로 나뉘며, 칸에는 0,1,…,n−10, 1, \dots, n-1 번호가 붙어 있습니다. 각 칸은 다음 세 가지 상태 중 하나입니다. (1) 숫자 0이 적혀 있다, (2) 숫자 1이 적혀 있다, (3) 비어 있다.

로봇은 언제나 테이프의 어느 한 칸 위에 있어야 합니다. 로봇을 테이프의 초기 위치에 놓은 뒤, ii 번째 로봇은 정해진 연산열 SiS_i 를 실행합니다. 연산은 R, 0, 1, * 문자로 이루어집니다.

  • R은 로봇을 한 칸 오른쪽으로 이동시킵니다. 오른쪽에 칸이 없으면 로봇은 폭발합니다.
  • 0은 현재 칸이 비어 있지 않으면 그 칸의 숫자를 0으로 바꿉니다. 비어 있으면 칸을 바꾸지 않습니다.
  • 1은 현재 칸이 비어 있지 않으면 그 칸의 숫자를 1로 바꿉니다. 비어 있으면 칸을 바꾸지 않습니다.
  • *는 현재 칸이 비어 있지 않으면 숫자 xx 를 1−x1-x 로 뒤집습니다. 비어 있으면 칸을 바꾸지 않습니다.

ii 번째 테이프의 상태는 길이 nn 의 문자열로 나타냅니다. 각 문자는 0, 1, - (빈 칸) 중 하나입니다. 테이프 ii 의 초기 상태가 입력 XiX_i 이고, 연산 후의 상태가 출력 YiY_i 입니다. 로봇이 폭발하면 출력은 없습니다.

로봇은 빈 칸을 바꾸지 않습니다. 따라서 테이프 ii 의 모든 칸이 비어 있으면 로봇은 아무것도 하지 않으며, 출력도 모든 칸이 비어 있는 상태입니다.

입력 XiX_i 와 목표 출력 YiY_i 가 주어졌을 때, 모든 로봇이 pp 번째 칸을 시작 위치로 사용해 폭발 없이 모든 연산을 마치고, 각자 출력 YiY_i 를 얻을 수 있는 위치 pp (0≤p<n0 \le p < n) 를 찾고자 합니다.

입력 X0,…,Xm−1X_0, \dots, X_{m-1} 과 출력 Y0,…,Ym−1Y_0, \dots, Y_{m-1} 의 조합 중, 그러한 위치 pp 가 적어도 하나 존재하는 조합의 개수를 구하세요. 답은 109+710^9 + 7 로 나눈 나머지를 출력합니다. 두 조합이 다르다는 것은 어떤 로봇의 입력이나 출력이 다르다는 뜻입니다.

입력

첫째 줄에 각 테이프의 칸 수 nn 과 테이프의 개수 mm 이 주어집니다. 이어지는 mm 개의 줄에는 로봇 ii 의 연산열 SiS_i 가 R, 0, 1, * 문자로 이루어진 문자열로 주어집니다.

출력

답을 109+710^9 + 7 로 나눈 나머지를 정수 하나로 출력합니다.

제한

모든 테스트 케이스에 대해 1≤n≤321 \le n \le 32, 1≤m≤10001 \le m \le 1000, 1≤∣Si∣≤1001 \le |S_i| \le 100 입니다.

예제2

  1. 예제 1

    입력
    2 1
    1R*
    
    예상 출력
    9
    
  2. 예제 2

    입력
    3 2
    1R0
    *
    
    예상 출력
    1468