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

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

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

洛谷 - P2444 - 病毒 - AC自动机的更多相关文章

  1. 洛谷P2444 病毒【AC自动机】

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

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

    正解:AC自动机 解题报告: 传送门! 首先看到这种题目二话不说先把trie树和fail指针建立起来 然后就想鸭,如果我们想让模式串和文本串尽量不能匹配,就要想办法让它跳fail指针,而不是继续往下走 ...

  3. 洛谷 - P3966 - 单词 - AC自动机

    https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...

  4. 洛谷P3808 & P3796 AC自动机模板

    题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...

  5. 洛谷.3121.审查(AC自动机 链表)

    题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...

  6. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

  7. 【洛谷 P2444】 [POI2000]病毒(AC自动机)

    题目链接 这么多字符串,肯定是自动机啦. 先建出AC自动机,然后怎么表示一个安全代码没有病毒代码呢? 就是存在一条路径不经过有病毒代码段结尾的节点呗. 所以呢?有环啊!dfs一下救星了. #inclu ...

  8. 【洛谷】P2444 [POI2000]病毒——AC自动机

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

  9. [洛谷P2444] [POI2000]病毒

    洛谷题目链接:[POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会 ...

随机推荐

  1. UITabBarController ---- 标签视图控制器

    直接上代码: // // AppDelegate.m // // #import "AppDelegate.h" #import "RootViewController. ...

  2. SolidEdge 如何绘制断裂剖视图 局部剖视图

    1 点击局部放大图,然后点击绘制按钮,然后点击选择要绘制的视图   2 绘制封闭的局部剖视图的剖面线(必须封闭,点击最后一个点封闭之后会变成蓝色虚线)   3 修改深度(不一定要在下图的右下角修改深度 ...

  3. HDU2897( 巴什博奕变形)

    邂逅明下 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  4. gulp - sass 插件一直安装不好?

    1.没有sass,只存在与scss 任务 gulp.task('scss', function() { return gulp.src(app.srcPath + '/sass/*.scss') .p ...

  5. 用 centrifugo 搭建 消息推送服务器 docker + rancher 搭建

    关于消息推送服务器 目前有很多第三方的开放成熟的推送服务.鉴于项目需要 我们项目需要自己搭建 自己的推送服务. 我们的推送应用场景 聊天消息 项目内部消息提醒 移动设备接受消息 应用到的相关软件工具知 ...

  6. 走入asp.net mvc不归路:[2]控制器概览

    asp.net mvc中最灵活的地方就是控制器,这里可以验证数据,可以跳转视图,还可以访问数据库等等.所以,我们要先从这里说起. 1 控制器就是继承了Controller的类,一般来说,类名后面都会增 ...

  7. 小博客| 登录 | 注册 | 留言 | 提Bug 小博客

     浏览(1502)  赞(29) 一直以来都想开发一个自己的网站,总想做一个网站然后让千千万万的人去访问,去使用,然后收到热烈的好评, 再然后某某著名机构有意投资我的网站(其实收购也是没有问题的), ...

  8. GY的实验室 - Phalcon+Nginx+PHP-FPM环境搭建(转)

    Phalcon简介 由于半路出家的缘故,没用过几个PHP框架,第一个了解的框架是公司自己的,然后又试着用了Yii,CI.在读了CSDN在某度的高排名翻译文章(PHP开发框架流行度排名:Laravel居 ...

  9. iGrimaceVX3.0和1.44在线源手机直接安装教程

    [第一步] 先安装好三个组件设备必须是苹果越狱好后 确定6点几跟7点几的版本号才干够 首先打开cydia 选开发人员 以下 点软件源 点右上角编辑  1加入源 apt.25pp.com和IG包下载源a ...

  10. 从.Net版本演变看String和StringBuilder性能之争

    在C#中string关键字的映射实际上指向.NET基类System.String.System.String是一个功能非常强大且用途非常广泛的基类,所以我们在用C#string的时候实际就是在用.NE ...