化簡後題意
給定三個用圖表示的自動機。自動機上的邊分爲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 中的任意位置。