我們假設已經有乙個無限長的串滿足要求,那如果我們拿它去匹配會發生什麼?
它會一直在ac自動機上轉圈,一定經過根節點且不會經過病毒字串結束的節點。
所以如果我們能找到乙個環滿足「一定經過根節點且不會經過病毒字串結束的節點」,那麼就可以找到乙個無限長的串。
我們可以用dfs找環。
#include #include#include
#include
#include
using
namespace
std;
int trie[30010][2], fail[30010], tot = 1
;int
n;bool end[30010], vis[30010], mark[30010
], ans;
char s[30010
];queue
q;void solve(int
x)
if (vis[x] || end[x]) return
; vis[x] = 1
; mark[x] = 1
;
if (trie[x][0]) solve(trie[x][0
]);
if (trie[x][1]) solve(trie[x][1
]); mark[x] = 0;}
intmain()
end[p] = 1
; }
for (int i = 0; i < 2; i++) trie[0][i] = 1
; fail[
1] = 0
; q.push(1);
while (!q.empty())
else}}
solve(1);
if (ans) puts("
tak"
);
else puts("
nie"
);
return0;
}
AC自動機 POI2000病毒
題意 給你一些字串,問能不能找到乙個無限長的字串,使得給定的這些字串不會出現在該無限長字串中 一般我們寫ac自動機都是盡可能的使多匹配,而本題反其道而行,要盡可能的不匹配,那麼我們可以遇到fail標記就跳 因為乙個字串的標記是在最後,中途就調走了肯定就不會遇到了 如果存在乙個無限長的字串,那麼我們內...
POI2000 病毒 AC自動機,簡單環搜尋
判斷是否能夠構建乙個 資料範圍 涉及多個串的匹配,可以考慮使用給定串的匹配.而該題要求我們構建符合條件的串.這裡就涉及乙個對樹構建成圖.由於要構建不含給定串,故對每個給定串終止位打上標記.這裡要注意 如果每個結點指向它的結點 如果我們能夠在圖上找到乙個符合條件的環,那麼就可以構建無限長的目標串.in...
AC自動機(病毒侵襲 )
題目大意 中文題目 具體思路 ac自動機模板題,編號的時候注意,是按照給定的id進行編號的。然後輸出的時候注意去重,雖然按道理來講通過last陣列是不會有重複的,但是如果是這種情況,病毒模板aaa,然後給你乙個模板串aaaaa,這樣的話,就肯定會有重複的了,所以需要去重,其次輸出的時候按照公升序輸出...