#include using namespace std; #ifdef _RUTHEN #include "debug.hpp" #else #define show(...) true #endif using ll = long long; #define rep(i, n) for (int i = 0; i < (n); i++) template using V = vector; int main() { ios::sync_with_stdio(false); cin.tie(0); int N, M; cin >> N >> M; V S(N); rep(i, N) cin >> S[i]; rep(j, M) { set st; rep(i, N) st.insert(S[i][j]); if (st.size() == 1) continue; if (st.size() >= 3) { cout << 0 << '\n'; return 0; } map mp; rep(i, N) mp[S[i][j]]++; show(mp); for (auto [c, cnt] : mp) { if (N - cnt > 1) { st.erase(c); } } show(st); int ans = 0; for (auto c : st) { int ind = -1; rep(i, N) { if (S[i][j] != c) { // S[i]のj文字目以降に、他のS[i]のj+1文字目以降が含まれているかを確認する ind = i; break; } } int ok = 1; show(ind); rep(i, N) { if (i == ind) continue; int k = j + 1; for (int sij = j; sij < M; sij++) { if (S[i][k] == S[ind][sij]) k++; if (k == M) break; } if (k >= M) continue; ok = 0; break; } ans += ok; } cout << ans << '\n'; return 0; } return 0; }