日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【AC自动机】病毒代码(ybtoj AC自动机-5)

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AC自动机】病毒代码(ybtoj AC自动机-5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

ybtoj AC自動機-5


題目大意

給出若干段01串,問你是否存在一個無限的01串,使得串中不存在給出的01串


解題思路

可以把給出01串用AC自動機處理,然后對每個01串的最后一位打上標記

根據AC自動機的連邊性質(即若無該邊,則連向next的該邊),其實就是要找一個環,使得環上沒有點被打上標記

找這個環可以用dfs實現


代碼

#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 30010 using namespace std; int n, w, ans, b[N], p[N], nx[N], to[N][2]; queue<int>d; char s[N]; void insert(char* s) {int n = strlen(s+1), now = 0;for (int i = 1; i <= n; ++i){int y = s[i] - '0';if (!to[now][y]) to[now][y] = ++w;now = to[now][y];}b[now] = 1;return; } void bfs() {for (int i = 0 ; i < 2; ++i)if (to[0][i]) d.push(to[0][i]);while(!d.empty()){int h = d.front();d.pop();for (int i = 0; i < 2; ++i)if (!to[h][i]) to[h][i] = to[nx[h]][i];else{nx[to[h][i]] = to[nx[h]][i];b[to[h][i]] |= b[nx[to[h][i]]];//傳遞d.push(to[h][i]);}}return; } void dfs(int x)//搜索 {if (p[x])//到過,即找到了環{ans = 1;return;}p[x] = 1;if (!b[to[x][0]] && p[to[x][0]] >= 0) dfs(to[x][0]);if (ans) return;if (!b[to[x][1]] && p[to[x][1]] >= 0) dfs(to[x][1]);p[x] = -1;//記憶化return; } int main() {scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%s", s+1);insert(s);}bfs();dfs(0);if (ans) puts("TAK");else puts("NIE");return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【AC自动机】病毒代码(ybtoj AC自动机-5)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。