解题思路:
对<禁止出现前缀>按字符串长度排序,首先判断是否有子串是其他子串的前缀,如有,在<禁止前缀>中只保留最短子串即可(即,如某禁止子串中的前缀也是禁止子串,则该子串可删去)。先求出N次操作共有2**N种可能,再把以<禁止前缀>开头的N次操作的组合减去即可。
T=int(input())
for tt in range(T):
N,P=[int(s) for s in input().split()]
sub_str=[]
for i in range(P):
sub_str.append(input())
ans=0
sub_str.sort(key=lambda x:len(x))
stack=[]
stack.append(sub_str[0])
ss=1
stack_num=set()
stack_num.add(len(sub_str[0]))
while ss<P:
nn=len(sub_str[ss])
flag=0
for ll in list(stack_num):
if sub_str[ss][:ll] in stack:
flag=1
break
if flag==0:
stack.append(sub_str[ss])
stack_num.add(len(sub_str[ss]))
ss=ss+1
num=2**N # if all can be legal
ans=0
if 'R' in stack and 'B' in stack:
ans=0
else:
for kk in stack:
len_kk=len(kk)
ans=ans+2**(N-len_kk)
ans=num-ans
print("Case #{}: {}".format(tt+1, ans))