給定n(2000)個01串,總長度不超過30000,問是否存在乙個無限長的01串不包含這n個串。
這是一道ac自動機題目,需要對ac自動機、fail樹、trie圖有概念。
將n個串建立ac自動機,標記每個字串的終結點以及它們在fail樹上的所有子節點為無效節點,問題就轉換成了trie圖上是否存在乙個從0節點可達的環。
判環的演算法:
設圖上所有節點的vis初始為0,在棧中為1,訪問完成後為2,然後開始dfs,如果dfs到乙個vis為1的節點,就說明有環。
**
/* littlefall : hello! */
#include
using
namespace std;
using ll =
long
long
;inline
intread()
;const
int m =
30016
;//注意字符集
struct aho_corasick_automaton
, fail[m]
=, sz=0;
bool dang[m]=;
//是否危險
intinit
(int id =0)
// 向trie樹中嘗試插入乙個模式串
void
insert
(const
char
*s) dang[u]=1
;}// 構建ac自動機
void
build()
else v = ch[fail[u]
][i]
;//建立trie圖}}
}int vis[m]
;//0未被訪問, 1在棧中, 2已訪問結束
bool
dfs(
int u)
// 從根節點出發有環說明有解
bool
query()
}ac;
char tmp[m]
;int
main
(void
) ac.
build()
;printf
("%s"
,ac.
query()
?"tak"
:"nie");
return0;
}inline
intread()
while
(ch>=
'0'&&ch<=
'9')
return x*f;
}
洛谷P2444 POI2000 病毒
二進位制病毒審查委員會最近發現了如下的規律 某些確定的二進位制串是病毒的 如果某段 中不存在任何一段病毒 那麼我們就稱這段 是安全的。現在委員會已經找出了所有的病毒 段,試問,是否存在乙個無限長的安全的二進位制 示例 例如如果為病毒 段,那麼乙個可能的無限長安全 就是010101 如果為病毒 段,那...
洛谷 P2444 POI2000 病毒 解題報告
二進位制病毒審查委員會最近發現了如下的規律 某些確定的二進位制串是病毒的 如果某段 中不存在任何一段病毒 那麼我們就稱這段 是安全的。現在委員會已經找出了所有的病毒 段,試問,是否存在乙個無限長的安全的二進位制 示例 例如如果為病毒 段,那麼乙個可能的無限長安全 就是010101 如果為病毒 段,那...
洛谷 P1101 題解
這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...