【BZOJ-2938】病毒 Trie图 + 拓扑排序
2938: [Poi2000]病毒
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 609 Solved: 318
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
01
11
00000
Sample Output
HINT
Source
Solution
Trie图的一大经典应用。
要构造一个无限长的安全串,显然是需要找至少一个安全的子串,然后循环下去,问题在于是否存在这样的子串。
建出Trie图之后,满足条件的子串必须在Trie图上不断匹配,而且不断失配无法达到危险节点。
这就说明,Trie图中存在不经过危险节点的环! 然后进行拓扑排序即可。
Code
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define MAXN 30010
- int N;
- char s[MAXN];
- struct EdgeNode{int next,to;}edge[MAXN<<];
- int head[MAXN],cnt=,d[MAXN],visit[MAXN];
- inline void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
- inline void InsertEdge(int u,int v) {AddEdge(u,v); d[v]++; /*printf("%d ---> %d\n",u,v);*/}
- namespace ACMachine
- {
- #define id(s) s-'0'
- int son[MAXN][],end[MAXN],sz=,fail[MAXN];
- inline void Insert(char str[])
- {
- int len=strlen(str+),now=;
- for (int i=; i<=len; i++)
- if (son[now][id(str[i])]) now=son[now][id(str[i])];
- else son[now][id(str[i])]=++sz,now=sz;
- end[now]=;
- }
- inline void Getfail()
- {
- queue<int>q; q.push();
- while (!q.empty())
- {
- int now=q.front(); q.pop();
- end[now]|=end[fail[now]];
- for (int i=; i<=; i++)
- {
- int fa=fail[now];
- while (fa && !son[fa][i]) fa=fail[fa];
- if (son[now][i])
- fail[son[now][i]]=fa? son[fa][i]:,q.push(son[now][i]);
- else son[now][i]=fa? son[fa][i]:;
- }
- }
- }
- }
- using namespace ACMachine;
- inline bool Topo()
- {
- queue<int>q;
- int sum=;
- for (int i=; i<=sz; i++)
- {
- if (end[i]) sum++; else
- for (int j=; j<=; j++)
- if (!end[son[i][j]]) InsertEdge(i,son[i][j]);
- }
- for (int i=; i<=sz; i++) if (!d[i] && !end[i]) q.push(i);
- while (!q.empty())
- {
- int now=q.front(); q.pop(); sum++;
- for (int i=head[now]; i; i=edge[i].next)
- if (!--d[edge[i].to]) q.push(edge[i].to);
- }
- return sum==sz;
- }
- int main()
- {
- scanf("%d",&N);
- for (int i=; i<=N; i++) scanf("%s",s+),Insert(s);
- Getfail();
- if (Topo()) puts("NIE"); else puts("TAK");
- return ;
- }
【BZOJ-2938】病毒 Trie图 + 拓扑排序的更多相关文章
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
题目: http://cojs.tk/cogs/problem/problem.php?pid=410 410. [NOI2009] 植物大战僵尸 ★★★ 输入文件:pvz.in 输出文件:p ...
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP
BZOJ_1916_[Usaco2010 Open]冲浪_分层图+拓扑排序+DP Description 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园. ...
- BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序
BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...
- BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]
2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...
- [USACO12DEC]第一!First! (Trie树,拓扑排序)
题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...
- 图——拓扑排序(uva10305)
John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...
随机推荐
- SpringAOP与Redis搭建缓存
近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做查询部分: 数据查询时每次都需要从数据库 ...
- 《HTML5》 Audio/Video全解
一.标签解读 <audio> 标签属性 <audio id="media" src="http://www.abc.com/test.mp3" ...
- 通过CSS的border绘制三角形
通过css的border 可以绘制出三角形, 不同的样式组合,有着不同的效果,可以控制它的大小,颜色,方向.看下面各种图形,相信可能还有很多图形,大家都没见过. 先写出公共的样式: .border { ...
- Css3新特性总结之边框与背景(二)
一.条纹背景 利用background为linear-gradient函数实现,linear-gradient取值如下: <angle>:角度,渐变的方向 to left right to ...
- css3制作炫酷导航栏效果
今天主要利用hover选择器.鼠标滑过查看效果. 一.普通导航栏 Home Content Service Team Contact 对于这种普通的导航栏,只是鼠标滑过的时候颜色会变,所以思路变得很简 ...
- 正确制作一个iframe,认识iframe
iframe作为一个网站之间交互的桥梁,受到很多站长的喜爱,但是又有不安全的因素存在,所以正确填写属性是很重要的. <iframe name="my_iframe" heig ...
- WCF+Restfull服务 提交或获取数据时数据大小限制问题解决方案
近日在使用wcf的restfull架构服务时遭遇到了提交大数据的问题. 大数据包含两种情形: 1)单条数据量过大. 2)提交或获取的数据条数过多. 在测试时发现,默认设置下当单条JSON数据大于30K ...
- 使用ViewPager切换Fragment时,防止频繁调用OnCreatView
使用ViewPager切换Fragment,我原先使用系统自带的适配器FragmentPagerAdapter. 切换fragment时,频繁调用oncreatview(). 查看FragmentPa ...
- 事件分发时候的onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent调用顺序
一直想弄清楚onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent的执行顺序,以及内部使用switch (event.getAction())中的执 ...
- UITableView cell复用出错问题 页面滑动卡顿问题 & 各杂七杂八问题
UITableView 的cell 复用机制节省了内存,但是有时对于多变的自定义cell,重用时会出现界面出错(例如复用出错,出现cell混乱重影).滑动卡顿等问题,这里只简单敲下几点复用出错时的解决 ...