만드는 중입니다

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

종이 접기

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

요약
알파벳 격자에서 접힌 쪽과 반대편의 대응 칸 글자가 모두 같을 때만 행이나 열을 접을 수 있습니다. 이렇게 얻을 수 있는 서로 다른 부분 행렬의 개수를 구합니다.
난이도

어려움10점 중 8점

유형
문자열 매칭, 해시맵, 구현
정답자
아직 제출이 없습니다

문제

종이가 N×MN \times M 크기의 행렬 모양으로 주어진다. 각 칸은 영어 소문자 26개 중 하나의 색으로 칠해져 있다. 종이는 다음과 같이 접을 수 있다.

먼저 인접한 두 열 사이의 세로선이나 인접한 두 행 사이의 가로선을 고른다. 이 선은 종이를 두 부분으로 나눈다. 그 선을 접는 축으로 삼아 작은 쪽을 큰 쪽 위로 접어 넘긴다. 작은 쪽의 모든 칸이 축에 대해 대칭인 칸과 같은 색이어야 접을 수 있다. 두 부분의 크기가 같으면 어느 쪽에서 접어도 된다.

접기를 몇 번 반복하든 결과는 항상 원래 종이의 연속된 부분 행렬이다. 접기를 임의의 횟수만큼(한 번도 하지 않을 수도 있다) 해서 얻을 수 있는 서로 다른 부분 행렬은 몇 개인가? 좌표가 다르면 색 내용이 같더라도 서로 다른 부분 행렬로 센다.

입력

첫 줄에 두 정수 NN과 MM이 주어진다(N,M≥1N, M \ge 1, 1≤N⋅M≤1 000 0001 \le N \cdot M \le 1\,000\,000). 다음 NN개 줄에는 길이 MM인 영어 소문자 문자열이 한 줄에 하나씩 주어진다. 이 줄들이 종이를 나타낸다.

출력

접어서 얻을 수 있는 서로 다른 부분 행렬의 개수를 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    5 7
    baabbaa
    cbbccbb
    ababbab
    cabccba
    bccaacc
    
    예상 출력
    2