化简后题意
给定三个用图表示的自动机。自动机上的边分为
a,b,null
三种,对于当前字符串的位置
i
,假如Si=a则走
a
边,Si=b则走
b
边,若为空则走null边。设三个自动机为
A,B,C
,从中保留最少的自动机,设为集合
T
,使得T的可识别字符串集合等于
A∩B∩C
可识别字符串集合。值得注意的是,字符串的长度限制是
L
,也就是说,假如存在一个字符串S,可被
T
识别,而不能被A∩B∩C识别,但
|S|>L
,依然视为不存在这样的
S
。并且保证字符串的每个字符都是a或
b
。
自动机的大小≤100。
L≤231−1
题解
设
f(x,y,z)
表示是否可能存在某个字符串,使得自动机
A
走到节点x,
B
到y,
C
走到z。特别地,假如某个节点不存在某条转移边,那么设其转移到0节点,并且对于终结节点
T
,其三种转移都转移回自己。
很显然地,由于自动机大小不超过100,那么
f(x,y,z)
只有
N3=106
种状态。
那么我们可以宽搜出所有的
f(x,y,z)
,转移就是:假设当前走到
(x,y,z)
,那么我们枚举下一步走的是
a
还是b,然后将
x,y,z
同时在自动机上走一步。很特殊的是,我们字符串可能在这一位终结,那么我们需要将
x,y,z
不停地沿
null
转移就好了。而且注意到题目中对于字符串长度有
L
的限制,也就是说对于f(x,y,z)的扩展,假如已经扩展了
L
步,我们就不能继续扩展了。
现在我们已经得到了f(x,y,z),考虑怎么得到答案。
先假设
T=A∩B
。其他同理。那么就是说不能出现
A,B
可以识别的字符串,而
C
不能识别。那么就相当于判断f(Ta,Tb,0)是否存在,若存在则不合法。
假如答案是1。假设
T=A
。那么相当于不能出现
A
可以识别而B,C不能识别的字符串。那么我们可以枚举是
B
或是C无法识别,假设是
C
,相当于判断f(Ta,pos,0)是否存在,
pos
是
B
<script type="math/tex" id="MathJax-Element-56">B</script>中的任意位置。