博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Luogu2444】病毒(AC自动机)
阅读量:5324 次
发布时间:2019-06-14

本文共 1223 字,大约阅读时间需要 4 分钟。

【Luogu2444】病毒(AC自动机)

题面

题解

如果存在一个无限长的串

证明可以在\(AC\)自动机上找到一个环
然后在上面可以无限跳

所以构建\(AC\)自动机

在上面跑\(dfs\)就好啦

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define MAX 50000struct Node{ int vis[2]; int fail,lt;}t[MAX];int n,tot;char ch[MAX];void insert(char *s){ int l=strlen(s+1),now=0; for(int i=1;i<=l;++i) { if(!t[now].vis[s[i]-48]) t[now].vis[s[i]-48]=++tot; now=t[now].vis[s[i]-48]; } t[now].lt=1;}void Getfail(){ queue
Q; for(int i=0;i<2;++i) if(t[0].vis[i])Q.push(t[0].vis[i]); while(!Q.empty()) { int u=Q.front();Q.pop(); t[u].lt|=t[t[u].fail].lt; for(int i=0;i<2;++i) if(t[u].vis[i]) t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]); else t[u].vis[i]=t[t[u].fail].vis[i]; }}bool vis[MAX];bool vv[MAX];void DFS(int u){ if(t[u].lt)return; if(vis[u]){puts("TAK");exit(0);} if(vv[u])return; vis[u]=true;vv[u]=true; for(int i=0;i<2;++i) if(t[u].vis[i]) DFS(t[u].vis[i]); vis[u]=false;}int main(){ scanf("%d",&n); while(n--) { scanf("%s",ch+1); insert(ch); } Getfail(); DFS(0); puts("NIE"); return 0;}

转载于:https://www.cnblogs.com/cjyyb/p/8333831.html

你可能感兴趣的文章
MySQL数据库8(十三)高级数据操作之select指令
查看>>
随心测试_Python Se_002<不同浏览器驱动>
查看>>
LeetCode 202. Happy Number
查看>>
【Codeforces Round #432 (Div. 2) A】 Arpa and a research in Mexican wave
查看>>
HTTP协议
查看>>
转载 jenkins执行selenium 测试 浏览器不显示解决方法
查看>>
spring+mybatis利用interceptor(plugin)兑现数据库读写分离
查看>>
wenbao与极角排序
查看>>
回顾JAVA---3.异常
查看>>
data Binding
查看>>
SSM配置
查看>>
HDU 5957 Query on a graph
查看>>
java基础语法
查看>>
Java中Runnable和Thread的区别
查看>>
spring基础概念AOP与动态代理理解
查看>>
洛谷 P1387 最大正方形
查看>>
洛谷 P3371 【模板】单源最短路径(弱化版) && dijkstra模板
查看>>
洛谷 P1082 同余方程(同余&&exgcd)
查看>>
洛谷 P5020 货币系统
查看>>
洛谷 P1077 摆花
查看>>