题意

给定多个01模式串,问是否存在一个无限长的字符串不包含任何一个模式串。

分析

  • 好像数据有点水,网上一大堆题解连样例都没过???
  • 多模式串,先把AC自动机建出来再说。
  • 反向考虑,若存在一个无限长的字符串不包含任何一个模式串,那就说明这个字符串可以在AC自动机上无限匹配,所以我们在AC自动机上dfs找环即可。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+50;
  4. bool flag;
  5. struct ACM{
  6. int tr[N][2],val[N],fail[N],cnt,x[N],vis[N];
  7. void init(){
  8. memset(tr,0,sizeof(tr));
  9. memset(val,0,sizeof(val));
  10. memset(fail,0,sizeof(fail));
  11. }
  12. void insert(char *s){
  13. int len=strlen(s);
  14. int now=0;
  15. for(int i=0;i<len;i++){
  16. int id=s[i]-'0';
  17. if(!tr[now][id]){
  18. tr[now][id]=++cnt;
  19. }
  20. now=tr[now][id];
  21. }
  22. val[now]++;
  23. x[now]++;
  24. }
  25. void build(){
  26. queue<int> q;
  27. for(int i=0;i<2;i++){
  28. if(tr[0][i]){
  29. q.push(tr[0][i]);
  30. fail[tr[0][i]]=0;
  31. }
  32. }
  33. while(!q.empty()){
  34. int u=q.front();
  35. q.pop();
  36. for(int i=0;i<2;i++){
  37. if(tr[u][i]){
  38. fail[tr[u][i]]=tr[fail[u]][i];
  39. x[tr[u][i]]+=x[tr[fail[u]][i]];
  40. q.push(tr[u][i]);
  41. }else{
  42. tr[u][i]=tr[fail[u]][i];
  43. }
  44. }
  45. }
  46. }
  47. void dfs(int u){
  48. if(flag){
  49. return;
  50. }
  51. vis[u]=0;
  52. for(int i=0;i<2;i++){
  53. int v=tr[u][i];
  54. if(x[v]){
  55. continue;
  56. }
  57. if(vis[v]==-1){
  58. dfs(v);
  59. }else if(vis[v]==0){
  60. flag=true;
  61. }
  62. }
  63. vis[u]=1;
  64. }
  65. void solve(){
  66. memset(vis,-1,sizeof(vis));
  67. dfs(0);
  68. }
  69. }ac;
  70. int n;
  71. char s[N];
  72. int main(){
  73. freopen("in.txt","r",stdin);
  74. scanf("%d",&n);
  75. ac.init();
  76. for(int i=0;i<n;i++){
  77. scanf("%s",s);
  78. ac.insert(s);
  79. }
  80. ac.build();
  81. ac.solve();
  82. if(flag){
  83. printf("TAK\n");
  84. }else{
  85. printf("NIE\n");
  86. }
  87. return 0;
  88. }

luoguP2444_[POI2000]病毒的更多相关文章

  1. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  2. BZOJ_2938_[Poi2000]病毒_AC自动机

    BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...

  3. P2444 [POI2000]病毒

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

  4. BZOJ 2938: [Poi2000]病毒

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 360[Submit][Status][Di ...

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

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

  6. [POI2000]病毒 --- AC自动机

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

  7. 【BZOJ2938】[Poi2000]病毒 AC自动机+DFS

    [BZOJ2938][Poi2000]病毒 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码 ...

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

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1678  Solved: 849[Submit][Status][D ...

  9. 洛谷 P2444 [POI2000]病毒 解题报告

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

随机推荐

  1. ZIP:GZIP

    GZIPInputStream: GZIPInputStream(InputStream in) :使用默认缓冲区大小创建新的输入流. GZIPInputStream(InputStream in, ...

  2. HttpClient多文件上传代码及普通参数中文乱码问题解决

    该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...

  3. 了解一下zookeeper,搭建单机版和集群版的环境玩玩,需要手稿的,留下邮箱

    第一章:Zookeeper介绍 Zookeeper,动物管理员,是用来管理hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员. Apache Hbase和Apache Solr的分布式集群 ...

  4. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  5. 前端基于vue,后台采用springboot+shiro的方式搭建的一个移动端商品展示平台

    基于vue实现的移动端商品展示页,可以web-view的方式嵌入到小程序中,布局简约.大气,减少初学者或开发者不必要的工作量.后台维护采用的springboot+shiro的方式,为广大爱好者提供展示 ...

  6. 入门训练-4. Fibonacci数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  7. TCP三次握手抓包理解

    TCP建立连接需要三次握手,分手需要四次握手,平时在网上看到很多次,但是还没有很理解.为什么分手要多一次?可能是刚开始追求女生的时候比较容易,到分手的时候就比较麻烦了吧... 了解某个东西要从它的基础 ...

  8. python基础——字符串(string)

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. str1 = 'python' str2 = " ...

  9. bean的创建(五)第四部分 bean构造器的查找

    前面分析了bean的静态工厂查找 bean的构造器查找过程和bean的静态工厂查找类似 protected BeanWrapper createBeanInstance(String beanName ...

  10. TestNG使用@Parameter给要测试的方法传递参数

    当需要测试的方法含有参数时,可以通过@Parameters 注解给该方法传递参数. 比如下面这个类,要调用whoami则必须写一个main函数,然后在main函数中调用该函数,并传入参数,使用Test ...