题目大意:
给定$n$个字符串$s_i(\sum|s_i|\leq30000)$,问是否能够造出一个无限长的字符串$t$,使得$t$中没有任何一个$s_i$。思路:
构造AC自动机。在自动机上DFS,避开所有的危险结点,判断是否有环。若存在环,则$t$存在。1 #include2 #include 3 #include 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x;10 }11 const int N=30001,S=2;12 char s[N];13 class AhoCorasick {14 private:15 int ch[N][S],fail[N];16 bool dan[N],ins[N],vis[N];17 std::queue q;18 int sz,new_node() {19 return ++sz;20 }21 int idx(const int &c) const {22 return c^'0';23 }24 public:25 void insert(const char s[]) {26 int p=0;27 for(register int i=0;s[i];i++) {28 const int c=idx(s[i]);29 p=ch[p][c]?:ch[p][c]=new_node();30 }31 dan[p]=true;32 }33 void get_fail() {34 for(register int c=0;c