hdu 2896 病毒侵袭 ac自动机

  1 /*
  2 hdu 2896 病毒侵袭 ac自动机 
  3 从题意得知,模式串中没有重复的串出现,所以结构体中可以将last[](后缀链接)数组去掉 
  4 last[]数组主要是记录具有相同后缀模式串的末尾节点编号 。本题中主要是计算每一个模式串
  5 在主串中有没有出现过,而不是计算出现过多少次,所以将last[]数组省掉.... 
  6 */ 
  7 #include<algorithm>
  8 #include<iostream>
  9 #include<cstdio>
 10 #include<cstring>
 11 #include<queue> 
 12 #define N 210*500
 13 using namespace std;
 14 class AC_atomata
 15 {
 16 public:
 17    int trie[N][128],  f[N], val[N];
 18    int vis[510];
 19    int nodeN;
 20    int total;
 21    queue<int>q;
 22    void init()
 23    {
 24       nodeN=0;
 25       val[0]=0;
 26       total=0;
 27       while(!q.empty()) q.pop();
 28       memset(trie[0], 0, sizeof(trie[0]));
 29    }
 30    void build(char *str, int index);//建立trie树 
 31    void getFail();//失配函数 
 32    void find(char *T, int n, int index);//查找函数 
 33 };
 34 
 35 
 36 void AC_atomata::build(char *str, int index)
 37 {
 38     int i, u;
 39     for(i=0, u=0; str[i]; ++i)
 40     {
 41         int ch=str[i];
 42         if(!trie[u][ch])
 43         {
 44             trie[u][ch]=++nodeN;
 45             memset(trie[nodeN], 0, sizeof(trie[nodeN]));
 46     }
 47     u=trie[u][ch];
 48     val[u]=0;
 49     }
 50     val[u]=index;
 51 }
 52 
 53 void AC_atomata::getFail()
 54 {
 55    int r, u, v, i;
 56    f[0]=0;
 57    for(i=0; i<128; ++i)
 58    {
 59        if(trie[0][i])
 60        {
 61              q.push(trie[0][i]);
 62              f[trie[0][i]]=0;
 63        }
 64    }
 65    while(!q.empty())
 66    {
 67       r=q.front();
 68       q.pop();
 69       for(i=0; i<128; ++i)
 70       {
 71             u=trie[r][i];
 72             if(!u) continue;
 73             q.push(u);
 74             v=f[r];
 75             while(v && !trie[v][i]) v=trie[v][i];
 76             f[u]=trie[v][i];
 77       }
 78    }
 79 }
 80 
 81 void AC_atomata::find(char *T, int n, int index)
 82 {
 83     int i, u;
 84     int cnt=0, v[3];
 85     memset(v, 0, sizeof(v));
 86     memset(vis, 0, sizeof(vis));//每一次查找将数组初始化,开始忘记初始化了, 哇了好多次 
 87     for(i=0, u=0; T[i]; ++i)
 88     {
 89         int ch=T[i];
 90         while(u && !trie[u][ch])  u=f[u];
 91         u=trie[u][ch];
 92         if(val[u] && !vis[val[u]])
 93         {
 94             v[cnt++]=val[u];
 95             vis[val[u]]=1;
 96             if(cnt>2) break;
 97         }
 98     }
 99     if(cnt>0)
100     {
101         ++total;
102         printf("web %d:", index);
103         sort(v, v+3);
104         for(i=0; i<3; ++i)
105            if(v[i])  printf(" %d", v[i]);
106         printf("\n");
107     }
108 }
109 
110 AC_atomata ac;
111 char T[10005], s[205];
112 
113 int main()
114 {
115    int n, m, i;
116    while(scanf("%d", &n)!=EOF)
117    {
118        ac.init();
119        for(i=1; i<=n; ++i)
120         {
121            scanf("%s", s);
122            ac.build(s, i);
123     }
124        ac.getFail();
125        scanf("%d", &m);
126        for(i=1; i<=m; ++i)
127        {
128              scanf("%s", T);
129              ac.find(T, n, i);
130        }
131        printf("total: %d\n", ac.total);
132    }
133    return 0;
134 } 
  1 /*
  2     上面的程序过了,感觉数据很水....
  3 */
  4 #include<iostream>
  5 #include<cstdio>
  6 #include<cstring>
  7 #include<queue>
  8 #define N 100005 
  9 #define M 505
 10 using namespace std;
 11 int n, m;
 12 class AC_atomata
 13 { 
 14 public:
 15     int trie[N][128], fail[N];
 16     int cnt;
 17     int vis[M];//标记边 
 18     int nodeN;//节点数 
 19     int val[N];//标记字符节点是否为单词末尾 
 20     queue<int>q;
 21     void init();
 22     void build(char *T, int index) ;
 23     void getFail();
 24     void find(char *S, int index);
 25 };
 26 
 27 void AC_atomata:: init()
 28 {
 29    while(!q.empty())  q.pop();
 30    memset(trie[0], 0, sizeof(trie[0]));
 31    nodeN=0;
 32    cnt=0;
 33    memset(val, 0, sizeof(val));
 34 }
 35 
 36 void AC_atomata:: build(char *T, int index)
 37 {
 38     int i, u=0;
 39     for(i=0; T[i]; ++i)
 40     {
 41         if(trie[u][T[i]]==0)
 42         {
 43             trie[u][T[i]]=++nodeN;
 44             memset(trie[nodeN], 0, sizeof(trie[nodeN]));
 45     }
 46     val[u]=0;
 47     u=trie[u][T[i]];
 48     }
 49     val[u]=index;
 50 }
 51 
 52 void AC_atomata:: getFail()
 53 { 
 54     int r, u, v; 
 55     int c, root=0;
 56     fail[root]=0;
 57     for(c=0; c<128; ++c)
 58     {
 59         if(v=trie[root][c])
 60         {
 61             fail[v]=root;
 62             q.push(v);
 63     }
 64     }
 65     while(!q.empty())
 66     {
 67         r=q.front(); q.pop();
 68     for(c=0; c<128; ++c)
 69     {
 70         u=trie[r][c];
 71         if(!u)//该节点不存在,也就是查找过程中每一个节点都是平等的
 72            trie[r][c]=trie[fail[r]][c];
 73         else
 74         {
 75             fail[u]=trie[fail[r]][c];
 76             q.push(u);
 77         }
 78     } 
 79     } 
 80 } 
 81 
 82 void AC_atomata:: find(char *S, int index)
 83 {
 84    int cur, root, count=0;
 85    cur=root=0;
 86    memset(vis, 0, sizeof(vis));
 87    for(int i=0; S[i]; ++i)
 88    {
 89        cur=trie[cur][S[i]];
 90        int next=cur;

          //这个while循环就是last[]数组实现的功能,只不过是last[]数组记录的总是单词结尾字符的节点的编号
          //而我们通过沿着 next 节点的失配方向一直搜索, 也可以寻找到 以next节点所对应字符结尾的单词

 91        while(next!=root)
 92        {
 93               if(val[next])
 94                  {
 95               vis[val[next]]=1;
 96               count++;
 97           }
 98               next=fail[next];
 99        } 
100    }
101    if(count>0)
102    {
103        ++cnt;
104        printf("web %d:", index);
105        for(int i=1; i<=n; ++i)
106          if(vis[i])
107            printf(" %d", i);
108        printf("\n");
109    }
110 } 
111 
112 char t[205], s[10005];
113 AC_atomata ac;
114 int main()
115 {   
116    int i;
117    while(scanf("%d", &n)!=EOF)
118    {
119        ac.init();
120        for(i=1; i<=n; ++i) 
121        {
122              scanf("%s", t);
123              ac.build(t, i);
124        }
125        ac.getFail();
126        scanf("%d", &m) ;
127        for(i=1; i<=m; ++i)
128        {
129              scanf("%s", s);
130              ac.find(s, i);
131        }
132        printf("total: %d\n", ac.cnt);
133    }
134    return 0;
135 }

 

 

转载于:https://www.cnblogs.com/hujunzheng/p/3801731.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axure原件 总是丢失_Axure实现提示文本单击显示后自动消失的效果

FORM一 .新增的input输入属性 1.email类型 在表单提交E-mail地址时,无效的输入会生成很多无效数据,对后期的数据检索造成一定的影响.所以在表单提交之前,需要对输入的E-mail地址进行有效 ...Google的Protobuf协议分析protobuf和thrift类似,也是一个序列化的协议实现,简称PB(下文…

linux php不能写文件内容,php 在linux系统下写出文件问题

最近写了一个简单的生成文件&#xff0c;服务器用的linux 但是在将文件写出到路径的时候就会写出一个其他的文件夹其中一些代码如下define("paddy",dirname(__FILE__));$gkrequest_uri();$filepathpaddy.$gk&#xff1b;createfile($filefath,$file)&#xff1b;//$f…

python mysql删除数据_python-mysql删除和更新数据

删除数据import codecsimport MySQLdbdef connect_mysql():db_config {host: 192.168.48.128,port: 3306,user: xiang,passwd: 123456,db: python,charset: utf8}cnx MySQLdb.connect(**db_config)return cnxif __name__ __main__:cnx connect_mysql()sql select * from S…

xlat指令...

1 ;就是一个串str1&#xff0c; lea ebx, str1 然后我们ebx1总是加上的是一个字节&#xff0c; 无论&#xff08;串是word&#xff0c; byte&#xff0c; dword&#xff09;2 .3863 .model flat4 .stack 40965 include io.h6 ExitProcess proto near32 stdcall, deExitCode:dwo…

php 串口通信例程,HAL库串口通信例程

请问下 为什么要 用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个函数呢?不用不行吗&#xff1f;static void MX_USART1_UART_Init(void){huart1.Instance USART1;huart1.Init.BaudRate 9600;huart1.Init.WordLength UART_WORDLENGTH_8B;huart1.Init.Stop…

char 类型与lpcwstr_「lpctstr」char* 与 LPCTSTR 类型的互相转换 - seo实验室

lpctstr1.char* 转换成 LPCTSTRchar ch[1024] "wo shi ni baba";int num MultiByteToWideChar(0,0,ch,-1,NULL,0);wchar_t *wide new wchar_t[num];MultiByteToWideChar(0,0,ch,-1,wide,num);解析&#xff1a;num 获得长字节所需的空间MultiByteToWideChar()表示将…

poj 2195 Going Home

1 /*2 做网络流的题建图真的是太重要了&#xff01;3 本题是将人所在的位置和房子所在的位置建立边的联系&#xff0c;其中man到house这一条边的流量为 1&#xff0c; 费用为两者的距离4 而方向边的流量为 0&#xff0c; 费用为正向边的相反数&#xff08;也就是沿着反…

CardLayout布局练习(小的图片浏览器)

1 /*2 涉及Panel中的图片的加载&#xff0c;还有Frame的关闭的方法&#xff0c; CardLayout&#xff08;int hgap, int vgap&#xff09;就会决定卡片面板的大小3 匿名类的使用。。。4 */5 import java.awt.*;6 import java.awt.event.*;7 import javax.swing.*;8 public class…

python求逆矩阵的方法,Python 如何求矩阵的逆

我就废话不多说了&#xff0c;大家还是直接看代码吧~import numpy as npkernel np.array([1, 1, 1, 2]).reshape((2, 2))print(kernel)print(np.linalg.inv(kernel))注意&#xff0c;Singular matrix奇异矩阵不可求逆补充&#xff1a;pythonnumpy中矩阵的逆和伪逆的区别定义&a…

plsql存过声明游标_plsql编程学习之游标一

oralce plsql编程的游标游标分类1显示游标2隐式游标隐式游标&#xff0c;oracle自动管理&#xff0c;不用声明&#xff0c;打开和关闭&#xff0c;ORACLE自动处理&#xff0c;使用隐式游标%FOUND时&#xff0c;需要加上 SQL%FOUND显示游标&#xff0c;需要自己声明&#xff0c;…

用命令行编译java并生成可执行的jar包

用命令行编译java并生成可执行的jar包 1.编写源代码。 编写源文件&#xff1a;CardLayoutDemo.java并保存&#xff0c;例如&#xff1a;I:\myApp\CardLayoutDemo.java。程序结构如下&#xff1a;package test;import java.awt.*; import javax.swing.*; //更多包的导入...clas…

python计时器单位,python(计时器)

计时器要求&#xff1a;定制一个计时器的类start 和 stop方法代表启动计时和停止计时假设计时器对象 t1&#xff0c;print(t1)和直接调用t1 均显示结果当计时器未启动或已停止计时&#xff0c;调用stop方法能给予温馨提示两个计时器对象可以相加&#xff1a; t1 t2只能使用提供…

查询分析300万笔记录_给你100万条数据的一张表,你将如何查询优化?

1.两种查询引擎查询速度(myIsam 引擎)InnoDB 中不保存表的具体行数&#xff0c;也就是说&#xff0c;执行select count(*) from table时&#xff0c;InnoDB要扫描一遍整个表来计算有多少行。MyISAM只要简单的读出保存好的行数即可。注意的是&#xff0c;当count(*)语句包含 whe…

poj 3321 Apple Trie

/*poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题&#xff01;可以利用dfs&#xff08;&#xff09;来搞定&#xff0c;我们在对一个节点深搜后&#xff0c;所经过的节点的数目就是该节点的子树的数目所以我们利用start[i]数组来记录 i 节…

php美团项目分享,美团项目(纯代码)(示例代码)

一.框架搭建1.icon规格要求可从文档中查找,搜索app icon.2.因为很多界面重复利用,所以不用storyboarda.删除stroyboard,在设置中Info -> Main storyboard file base name 项直接去除b.创建ZXHomeViewController(UICollectionViewController)和ZXNavigationController(UINavi…

ioc spring 上机案例_Spring的IoC入门案例

1、创建工程&#xff0c;导入坐标1.1 创建工程1.2 导入坐标xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.examplespring_01_io…

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...

1 /*2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中&#xff0c;3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的&#xff0c;而原构造函数中的代码则移到了构造函数的最后执行4 */5 import static java.lang.System.out;6 7 public clas…

liunx php的项目地址,在 Linux 配置 PHP 项目

在 Linux 配置 PHP 项目一, 搭建测试环境软件环境:(PHP 项目)PHP5.4Apache(httpd2.4)mysql5.7二, 安装1挂载:1. 把 iso 的镜像文件放到虚拟机 Linux 的 CD/ROM(在右下角 (网络适配器 / 桥接模式) 旁有个光盘, 点击连接, 之后页面出现一个光盘)2. 使用挂载命令, 把 CD/ROM 设备里…

springwebflux 页面_【SpringBoot WEB系列】WebFlux静态资源配置与访问

上一篇博文介绍SpringMVC的静态资源访问&#xff0c;那么在WebFlux中&#xff0c;静态资源的访问姿势是否一致呢I. 默认配置与SpringBoot的默认配置一样&#xff0c;WebFlux同样是classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/…

java中TreeSet集合如何实现元素的判重

1 /*2 看一下部分的TreeSet源码....3 public class TreeSet<E> extends AbstractSet<E>4 implements NavigableSet<E>, Cloneable, java.io.Serializable5 {6 private transient NavigableMap<E,Object> m;7 //NavigableMap继承SortedMap&…