https://www.luogu.org/problemnew/show/P2444

有点恶心,不太明白fail的意义。

#include<bits/stdc++.h>
using namespace std;
#define ll long longstruct Trie{int nex[60010][2],fail[60010],End[60010];int root,L;int newnode(){/*for(int i=0;i<26;i++)nex[L][i]=-1;*/End[L++]=0;return L-1;}int cnt;void init(){L=0;cnt=0;memset(nex,-1,sizeof(nex));root=newnode();}void insert(char buf[]){int len=strlen(buf);int now=root;for(int i=0;i<len;i++){int &t=nex[now][buf[i]-'0'];if(t==-1)t=newnode();now=t;}End[now]++;cnt++;}void build(){queue<int>Q;fail[root]=root;for(int i=0;i<2;i++){if(nex[root][i]==-1){nex[root][i]=root;//根节点没有对应的分支,还是必须回到根节点开始匹配
            }else{//根节点的后继失配,先假定回到根节点匹配fail[nex[root][i]]=root;Q.push(nex[root][i]);}}while(!Q.empty()){int now=Q.front();Q.pop();for(int i=0;i<2;i++)if(nex[now][i]==-1){//某个节点没有这个对应的分支,它失配了,沿着失配边去到最近的有这个分支的边?nex[now][i]=nex[fail[now]][i];}else{fail[nex[now][i]]=nex[fail[now]][i];Q.push(nex[now][i]);//如果这个节点的fail指针指向的点是End,那么因为这个节点蕴含他的fail节点,所以他也是EndEnd[now]|=End[fail[now]];}}}/*int query(char buf[]){int len=strlen(buf);int now=root;int res=0;for(int i=0;i<len;i++){now=nex[now][buf[i]-'0'];int temp=now;while(temp!=root&&End[temp]!=-1){res+=End[temp];End[temp]=-1;temp=fail[temp];}//if(res==cnt)//return res;}return res;}*/int vis[60005];int instack[60005];int find_circle(){memset(vis,0,sizeof(vis));memset(vis,0,sizeof(instack));return dfs(root);}int dfs(int id){instack[id]=1;vis[id]=1;for(int i=0;i<2;i++){if(instack[nex[id][i]]){//该节点的下一条边在dfs栈中,是反向边printf("TAK\n");exit(0);}if(vis[nex[id][i]]==0){//不访问已经到过的表亲,表亲不可能成环if(End[nex[id][i]]==0){//下一个点不是病毒
                    dfs(nex[id][i]);}}}instack[id]=0;return 0;}};char buf[100010];Trie ac;int n;
void solve(){while(~scanf("%d",&n)){if(n==0)break;ac.init();for(int i=0;i<n;i++){scanf("%s",buf);ac.insert(buf);}ac.build();//scanf("%s",buf);if(ac.find_circle()==0){cout<<"NIE"<<endl;}}
}int main(){
#ifdef Yinkufreopen("Yinku.in","r",stdin);//freopen("Yinku.out","w",stdout);
#endif // Yinkusolve();
}

转载于:https://www.cnblogs.com/Yinku/p/10538026.html

洛谷 - P2444 - 病毒 - AC自动机相关推荐

  1. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

  2. [AC自动机][dfs] 洛谷 P2444 病毒

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  3. BZOJ2938[Poi2000]病毒——AC自动机

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...

  4. BZOJ2938: [Poi2000]病毒(AC自动机)

    Orz wlp 5min讲完后缀数组 题意 给出$n$个0, 1串 问是否可以构造出一个无限长的字符串使其不包含任意串 Sol 刚开始我试图假装自己不知道这是个AC自动机的题然后来做.发现根本不可能q ...

  5. 洛谷-P3975 弦论(后缀自动机板子题)

    弦论 一道板子题,让我感觉板子题都还不会...然后把递推写成dfs时没有给string加上&,导致内存爆了,2333,果然还是传引用好 题意:求字典序第K小子串以及本质不同的第K小子串 思路: ...

  6. 提高篇 第二部分 字符串算法 第4章 AC自动机

    https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...

  7. BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)

    BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...

  8. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines

    P1948 [USACO08JAN]电话线Telephone Lines 题目描述 Farmer John wants to set up a telephone line at his farm. ...

  9. 题解 洛谷P4473 【[国家集训队]飞飞侠】

    这道题今天我们考试考到了,第三题,最后只剩半小时了,随便打了个暴搜,最后竟然还没调完QAQ,我竟然连暴力都不会打了 咳咳,不扯了,下面开始说这道题的做法 由于N和M都不大于150最容易想到的是Floy ...

最新文章

  1. 作为一个java程序员,常用的linux命令(越攒越多)
  2. JBPM4常见错误汇总
  3. 数学思想 —— 低维与高维的统一
  4. PHP的void mixed
  5. 职业生涯中的愚蠢想法
  6. 菜单项onCreateOptionsMenu()和onOptionsItemSelected()的使用
  7. 前端学习(2250)拉取代码文件
  8. python中superclass是什么_Python中super()函数简介及用法分享
  9. JAVA程序错误总结
  10. 华为荣耀20s云服务_华为荣耀20和20s的区别
  11. centos7 mysql读写监控,《Centos7——zabbix监控mysql的常规操作》
  12. ”十六“进制查看器(转)
  13. xctf攻防世界 MISC高手进阶区 2-1
  14. AngularJs $http.post 数据后台获取不到数据问题 的解决过程
  15. 安卓APP的字体大小设置不受系统字体大小的影响
  16. 【C语言】函数的理解——关于函数的声明
  17. 四点之间最短路(spfa+优先队列+枚举优化)UESTC1955喜马拉雅山上的猴子
  18. html前端 rem布局,完美兼容各手机端的尺寸,自适应布局
  19. Java NIO 框架 Netty 之美:粘包与半包问题
  20. 【frp】使用 frp 实现内网穿透(CentOS 云服务器 + Win10)

热门文章

  1. 基于容器原理(docker、lxc、cells)的Android 双系统设计概要
  2. IOTA 交易,确认和共识
  3. 使用web3.js进行开发
  4. WatchDog工作原理
  5. JZOJ 3947 . 【省常中JSOI模拟】收历史作业
  6. ubuntu14.04,安装JDK1.8(JAVA程序需要的开发、运行环境)
  7. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验
  8. pythonselenium获取html标签内容_python selenium 如何获取网页页面所有可以点击的元素?...
  9. [转载]出了国才明白的10件事~(MITBBS ZT)
  10. 目前对Learning to Rank 最全面的总结