Freezing
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

空。



n 个魔怔人在一个群里,每个魔怔人都可能会说 m 句魔怔话。

你现在知道他们每个人会说哪些魔怔的话,用一个字符串表示,若 s_i,表示这个人会说第 i 句魔怔话,若 s_i,则表示这个人不会说第 i 句魔怔话。

你想选出其中的若干个魔怔人,让他们站成一队,队列不能为空,这个队列需要满足以下的特征:

  • 按照原来的顺序,但是不必连续。比如可以是第 1, 3, 5, 6, 7 个人,也可以是第 1, 2, 3, 4 个人,也可以是第 1, 4, 5 个人,但不可以是第 1, 9, 8 个人,因为不是按照原来的顺序。
  • 相邻的两个人不能会说同样的魔怔话。比如前面的人会说第 1, 3, 5 句,后面的人会说第 4 句,那么可以站在一起,但是如果前面的人会说第 1, 2, 3, 5 句,而后面的人会说第 4, 5 , 6 句,那么不能站在一起,因为他们都会说第 5 句魔怔话,可能会魔怔对方。

请问,你有多少种站队的方法,对 998,244,353 取模。

输入描述:

第一行,两个正整数 

接下来 n 行,每行一个长度为 m 的字符串 s_i,保证任何字符串都由  构成。

输出描述:

一行一个正整数,表示站队的方法数对 998,244,353 取模后的结果。
示例1

输入

复制
5 3
hoh
hhh
ooo
hoh
ooh

输出

复制
12
示例2

输入

复制
3 7
hhhhhhh
oohhoho
ohhoohh

输出

复制
5