【AC自动机】病毒代码(ybtoj AC自动机-5)
生活随笔
收集整理的這篇文章主要介紹了
【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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网课摄像头怎么开美颜网课摄像头怎么开美颜
- 下一篇: 图片放大后模糊怎么变清晰图片放大后很模糊