当前位置: 首页 > news >正文

Hdu 3065 病毒侵袭持续中(AC自动机)

病毒侵袭持续中
Time Limit: 2000 Memory Limit: 32768
Problem Description
小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?
Input
第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
Output
按以下格式每行一个,输出每个病毒出现次数。未出现的病毒不需要输出。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
Sample Input
3
AA
BB
CC
ooxxCC%dAAAoen….END
Sample Output
AA: 2
CC: 1
Hint
Hit:
题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。
计数策略也可一定程度上从Sample中推测。
Source
2009 Multi-University Training Contest 16 - Host by NIT

/*
这题不是1A.
吐槽一下:又是多组输入.
有几个点需要注意一下.
这题是不需要用mark判重的,这点没想到.
还有出现不合法字符的时候要指针要指到root.
不然就认为是忽略了不合法字符把两边连接起来了.
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define MAXN 50010
#define MAXM 2000010
using namespace std;
int n,m,l,tot=1,a[1001],fail[MAXN];
char s[MAXM],ch[1001][52];
struct data{int x[27],b;}tree[MAXN];
queue<int>q;
void add(int t)
{
    l=strlen(s+1);int now=1;
    for(int i=1;i<=l;i++)
    {
        int x=s[i]-64;
        if(!tree[now].x[x]) tree[now].x[x]=++tot;
        now=tree[now].x[x];
    }
    tree[now].b=t;
    return ;
}
void get_fail()
{
    for(int i=1;i<=26;i++) tree[0].x[i]=1;
    q.push(1);
    while(!q.empty())
    {
        int now=q.front();q.pop();
        for(int i=1;i<=26;i++)
        {
            if(!tree[now].x[i]) continue;
            int k=fail[now];
            while(!tree[k].x[i]) k=fail[k];
            k=tree[k].x[i];
            fail[tree[now].x[i]]=k;
            q.push(tree[now].x[i]);
        }
    }
    return ;
}
void Mark()
{
    int now=1;l=strlen(s+1);
    for(int i=1;i<=l;i++)
    {
        if(s[i]<'A'||s[i]>'Z') {now=1;continue;}
        int x=s[i]-64;
        while(!tree[now].x[x]) now=fail[now];
        now=tree[now].x[x];
        int k=now;
        while(k)
        {
            if(tree[k].b) a[tree[k].b]++;
            k=fail[k];
        }
    }
    return ;
}
void Clear()
{
    memset(ch,0,sizeof ch);// 1 w.
    memset(fail,0,sizeof fail);
    memset(a,0,sizeof a);
    memset(tree,0,sizeof tree);
    tot=1;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        Clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s+1),add(i);
            for(int j=1;j<=strlen(s+1);j++) ch[i][j]=s[j];
        }
        get_fail();
        scanf("%s",s+1);
        Mark();
        for(int i=1;i<=n;i++)
          if(a[i]) printf("%s: %d\n",ch[i]+1,a[i]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/nancheng58/p/10068035.html

相关文章:

  • Error #2044: 未处理的 IOErrorEvent:。 text=Error #2038: 文件 I/O 错误。
  • sql server 函数详解(4)日期和时间函数
  • 【CSP】字符与int
  • flex 多文件上传
  • 网络基础
  • hibernate常见错误
  • oracle中REF Cursor用法
  • 结对作业
  • FLEX在datagrid中的itemreader中渲染combobox使用outerDocument
  • shell分库备份
  • DataGrid里嵌入checkBox,增加,删除等控件等操作
  • 最近前端面试遇到的题目
  • flex 鼠标中间滚动按钮监听
  • Linux基础之命令练习Day3-文件管理:cat,tar,gzip,vim,ln
  • flex shareObject对象详解
  • [LeetCode] Wiggle Sort
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 30秒的PHP代码片段(1)数组 - Array
  • 4个实用的微服务测试策略
  • angular2 简述
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • JavaScript设计模式系列一:工厂模式
  • MD5加密原理解析及OC版原理实现
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • spring学习第二天
  • tweak 支持第三方库
  • Vim Clutch | 面向脚踏板编程……
  • 当SetTimeout遇到了字符串
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前嗅ForeSpider采集配置界面介绍
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我有几个粽子,和一个故事
  • 中文输入法与React文本输入框的问题与解决方案
  • const的用法,特别是用在函数前面与后面的区别
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #AngularJS#$sce.trustAsResourceUrl
  • (Java数据结构)ArrayList
  • (NSDate) 时间 (time )比较
  • (第一天)包装对象、作用域、创建对象
  • (十)T检验-第一部分
  • (实战篇)如何缓存数据
  • (小白学Java)Java简介和基本配置
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)visual stdio 书签功能介绍
  • (转)负载均衡,回话保持,cookie
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core使用ef 6
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • //解决validator验证插件多个name相同只验证第一的问题
  • [20190113]四校联考
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)