HDUnbsp;3065nbsp;病毒侵袭持续中(AC自动…

2023-10-20 03:38

本文主要是介绍HDUnbsp;3065nbsp;病毒侵袭持续中(AC自动…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065

 

分析见上一篇博客

直接附代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct point{
   int count;
   struct point *fail,*next[26];
}*Tree,Node;
Tree root,Q[50008];
char str[2000008];
int num[1008];

Tree NEW()
{
   int i;
   Tree p;
   p=(Tree)malloc(sizeof(Node));
   for(i=0;i<26;i++)
       p->next[i]=NULL;
   p->fail=NULL;
   p->count=-1;
   return p;
}

void Build(char ss[],int u)
{
   int i=0;
   Tree p,s;
   p=root;
   while(ss[i])
   {
       if(p->next[ss[i]-'A']==NULL)
       {
           s=NEW();
           p->next[ss[i]-'A']=s;
           p=s;
       }
       else p=p->next[ss[i]-'A'];
       i++;
   }
   p->count=u;

}

void AC_Automation()
{
   int i,front=0,rear=0;
   Tree p,temp;
   root->fail=NULL;
   Q[front++]=root;
   while(rear<front)
   {
       temp=Q[rear++];
       p=NULL;
       for(i=0;i<26;i++)
       {
           if(temp->next[i]!=NULL)
           {
               if(temp==root)temp->next[i]->fail=root;
               else
               {
                   p=temp->fail;
                   while(p!=NULL)
                   {
                       if(p->next[i]!=NULL)
                       {
                           temp->next[i]->fail=p->next[i];
                           break;
                       }
                       p=p->fail;
                   }
                   if(p==NULL)temp->next[i]->fail=root;
               }
               Q[front++]=temp->next[i];
           }
       }
   }
}

void search()
{
   int i=0;
   Tree p=root,temp;
   memset(num,0,sizeof(num));
   while(str[i])
   {
       if(str[i]>='A' && str[i]<='Z')
       {
           while(p->next[str[i]-'A']==NULL && p!=root)p=p->fail;

           p=p->next[str[i]-'A'];
           if(p==NULL)p=root;
           temp=p;
           while(temp!=root)
           {
               if(temp->count>=0)
                   num[temp->count]++;
               temp=temp->fail;
           }
       }
       else p=root;
       i++;
   }
}

int main()
{
   int n,i;
   char ss[1008][55];
   while(scanf("%d",&n)!=EOF)
   {
   root=NEW();
   for(i=0;i<n;i++)
   {
       scanf("%s",ss[i]);
       Build(ss[i],i);
   }
   AC_Automation();
   getchar();
   gets(str);
   search();
   for(i=0;i<n;i++)
       if(num[i]!=0)
       printf("%s: %d\n",ss[i],num[i]);
   }
   return 0;
}

这篇关于HDUnbsp;3065nbsp;病毒侵袭持续中(AC自动…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244389

相关文章

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

云原生之高性能web服务器学习(持续更新中)

高性能web服务器 1 Web服务器的基础介绍1.1 Web服务介绍1.1.1 Apache介绍1.1.2 Nginx-高性能的 Web 服务端 2 Nginx架构与安装2.1 Nginx概述2.1.1 Nginx 功能介绍2.1.2 基础特性2.1.3 Web 服务相关的功能 2.2 Nginx 架构和进程2.2.1 架构2.2.2 Ngnix进程结构 2.3 Nginx 模块介绍2.4

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ