病毒侵袭 (数组)

c++简易病毒程序(dev++) 我们将用dev++制作一个简易病毒。作者本人差点挂了... 阅读详情

 

I - 病毒侵袭

 HDU - 2896 

当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 
但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找出来。当然,谁都知道这是不可能的。小t却执意要完成这不能的任务,他说:“子子孙孙无穷匮也!”(愚公后继有人了)。 
万事开头难,小t收集了好多病毒的特征码,又收集了一批诡异网站的源码,他想知道这些网站中哪些是有病毒的,又是带了怎样的病毒呢?顺便还想知道他到底收集了多少带病毒的网站。这时候他却不知道何从下手了。所以想请大家帮帮忙。小t又是个急性子哦,所以解决问题越快越好哦~~ 

Input

第一行,一个整数N(1<=N<=500),表示病毒特征码的个数。 
接下来N行,每行表示一个病毒特征码,特征码字符串长度在20—200之间。 
每个病毒都有一个编号,依此为1—N。 
不同编号的病毒特征码不会相同。 
在这之后一行,有一个整数M(1<=M<=1000),表示网站数。 
接下来M行,每行表示一个网站源码,源码字符串长度在7000—10000之间。 
每个网站都有一个编号,依此为1—M。 
以上字符串中字符都是ASCII码可见字符(不包括回车)。 

Output

依次按如下格式输出按网站编号从小到大输出,带病毒的网站编号和包含病毒编号,每行一个含毒网站信息。 
web 网站编号: 病毒编号 病毒编号 … 
冒号后有一个空格,病毒编号按从小到大排列,两个病毒编号之间用一个空格隔开,如果一个网站包含病毒,病毒数不会超过3个。 
最后一行输出统计信息,如下格式 
total: 带病毒网站数 
冒号后有一个空格。 

Sample Input

3
aaa
bbb
ccc
2
aaabbbccc
bbaacc

Sample Output

web 1: 1 2 3
total: 1

思路:

AC自动机的模板题

注意:

 这道题我MLE两天 ,拜读了无数人的代码,终于发现我是清零(init())那错了,要在插入字典树那里一步一步清零。

HDU  MLE了2页 ?

代码: 

 

 

 

数组:

time(ms)390  mem(mb) 32.5

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

const int maxm=500005;
int n,m,cou,rt;
char s[10005];
int ans[5]= {0};

int ne[maxm][128];
int fail[maxm]; //shi
int vis[maxm]; //zhi
int book[maxm]; //biao

int tot; //ge

void init()
{
    mem(ne[0],-1);
    fail[0]=-1;
    vis[0]=0;
    tot=1;
}

void Insert(char *str,int y)
{
    int ls=strlen(str);
    rt=0;
    for(int i=0; i<ls; i++)
    {
        int x=str[i];
        if(ne[rt][x]==-1)
        {
            mem(ne[tot],-1);
            fail[tot]=-1;
            ne[rt][x]=tot++;
        }
        rt=ne[rt][x];
    }
    vis[rt]=y;
}
void Build()
{
    queue<int>qu;
    qu.push(0);
    while(!qu.empty())
    {
        int u=qu.front();
        qu.pop();
        for(int i=0; i<128; i++)
        {
            if(ne[u][i]!=-1)
            {
                if(u==0)
                    fail[ne[u][i]]=0;
                else
                {
                    int v=fail[u];
                    while(v!=-1)
                    {
                        if(ne[v][i]!=-1)
                        {
                            fail[ne[u][i]]=ne[v][i];
                            break;
                        }
                        v=fail[v];
                    }
                    if(v==-1)
                        fail[ne[u][i]]=0;
                }
                qu.push(ne[u][i]);
            }
        }
    }
}
void match(char *str)
{
    int ls=strlen(str);
    rt=0;
    cou=0;
    mem(book,0);
    for(int i=0; i<ls; i++)
    {
        int x=str[i];
        while(ne[rt][x]==-1&&rt!=0)
            rt=fail[rt];
        rt=ne[rt][x];
        if(rt==-1)
            rt=0;
        int tmp=rt;
        while(tmp!=0&&book[tmp]==0)
        {
            if(vis[tmp])
            {
                ans[cou++]=vis[tmp];
                if(cou==3)
                    break;
            }
            book[tmp]=1;
            tmp=fail[tmp];
        }
        if(cou==3)
            break;
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        int total=0;
        init();
        for(int i=1; i<=n; i++)
        {
            scanf("%s",s);
            Insert(s,i);
        }
        Build();
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            scanf("%s",s);
            match(s);
            if(cou)
            {
                total++;
                printf("web %d:",i);
                sort(ans,ans+cou);
                for(int i = 0; i < cou; i++) {
                    printf(" %d",ans[i]);
                }
                printf("\n");
            }
        }
         printf("total: %d\n",total);
    }
    return 0;
}

 结构体数组:

Time               Mem
(ms)   265       (MB)   30.9

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=10005;
const int maxm=100005;
int book[maxm];
int ans[5];
int cou=0;
struct Aho
{
    int ne[maxm][128]; //
    int fail[maxm]; //失配指针
    int cnt[maxm];
    int vis[maxm];

    int tot;  //结点个数

    queue<int> qu;

    void init()  //初始化
    {
        while(!qu.empty())
            qu.pop();
        mem(ne[0], 0);//
        fail[0]=-1;
        tot=1;
    }

    void Insert(char *str,int y)  //插入字符串
    {
        int ls=strlen(str);
        int rt=0;
        for(int i=0; i<ls; i++)
        {
            int x=str[i];   //把字符串的字符存入字典树
            if(!ne[rt][x])
            {
                mem(ne[tot],0);
                fail[tot]=-1;
                ne[rt][x]=tot++;  //若这一字符没有在这一分支 ,节点数+1;
            }
            rt=ne[rt][x];
        }
        vis[rt]=y;
        //   printf("stateT_cnt==%d\n",stateT[rt].cnt);
    }

    void Build()  //失配指针,若失配要找到它的父亲,进行宽搜(queue)
    {
        fail[0]=-1;  //根节点指向-1
        qu.push(0);
        while(!qu.empty())
        {
            int u=qu.front();
            qu.pop();
            for(int i=0; i<128; i++)  //提出一个点
            {
                if(ne[u][i]) //如果有
                {
                    if(u==0)  //当它是根节点时指向0;
                        fail[ne[u][i]]=0;
                    else   //没有,就找祖先
                    {
                        int v=fail[u];
                        while(v!=-1)   //一直找 直到祖先有i这条边
                        {
                            if(ne[v][i])
                            {
                                fail[ne[u][i]]=ne[v][i];
                                break;  //保证找到的是最长的
                            }
                            v=fail[v];
                        }
                        if(v==-1)  //没找到
                            fail[ne[u][i]]=0;
                    }
                    qu.push(ne[u][i]);
                }
            }
        }
    }

    void Match(char *str)
    {
        int ls=strlen(str);
        int rt=0;
        cou=0;
        mem(book,0);
        for(int i=0; i<ls; i++)  //找的是以i为后缀有几个匹配的字符串
        {
            int x=str[i];
            if(ne[rt][x])
                rt=ne[rt][x];
            else  //找祖先
            {
                int f=fail[rt];

                while(f!=-1 && ne[f][x]==0) //所指数没有值
                    f=fail[f];
                if(f==-1)  //始终没找到,回到根节点
                    rt=0;
                else
                    rt=ne[f][x];
            }
            int lin=rt;
            while(lin!=0&&book[lin]==0)
            {
                if(vis[lin])
                {
                    ans[cou++]=vis[lin];
                    if(cou==3)
                        break;
                }
                 book[lin]=1;
                lin=fail[lin];
            }
            if(cou==3)
                break;
        }
    }
}aho;
int n;
char S[maxn];
int main()
{

    while(~scanf("%d",&n))
    {
        int total=0;
        aho.init();  //初始化

        for(int i=1; i<=n; i++)
        {
            scanf("%s",S);
            aho.Insert(S,i);  //插入字典树
        }
        aho.Build();  //建AC自动机的树
        int m;
        scanf("%d",&m);
        for(int i=1; i<=m; i++)
        {
            scanf("%s",S);
            aho.Match(S);
           if(cou)
            {
                total++;
                printf("web %d:",i);
                sort(ans,ans+cou);
                for(int i = 0; i < cou; i++) {
                    printf(" %d",ans[i]);
                }
                printf("\n");
            }
        }
        printf("total: %d\n",total);
    }

    return 0;
}

 

C++病毒 都知道我用Python做过病毒,做过很多病毒,但有人知道我用C++也做病毒吗?C++是离操作系统最近的编程语言之一,因此C++的运行速度极快,这也导致了我特别喜欢用C++做病毒。大家有没有玩过一个操作,首先新建一个文本文档,在里面写上start https://www.pranx.com/hacker/,然后把后缀名改成bat?对了,如果你的攻击对象网络不好的话,还可以加一个打开百度。C++里有3中循环:for循环,while循环,do-while循环。这个就是C++打开cmd的代码。 阅读详情

相关推荐

[hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]

病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 20728    Accepted Submission(s): 5058 Problem Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地

skysys的研究小屋 1638

一段简单的C/C++病毒源程序

主要是感染C/C++源文件只要编译该段源程序就会使当前目录里的所有.c和.cpp文件感染上病毒,当然如果是没有主函数的源文件就没有作用:思想很简单:插入一段复制自身的代码,而这段代码是将自身的病毒部分传播给同目录下的其它文件。

mycaibo编程 1万+

GraphSense介绍

GraphSense是一个跨账本加密货币分析平台 它的介绍在这里 代码也是开源的 graphsense-dashboard 用于交互式加密货币分析的Web仪表板。 可以看导进数据的情况 graphsense-transformation 基于spark/cassandra/java服务运行 GraphSense转换管道,用于将加密货币的区块/交易/标签等数据导入,可以看它指定的json格式: t...

幸福诗歌的博客 1083

hdu 2896 病毒侵袭 //AC自动机

<br /> <br />病毒侵袭Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)<br />Total Submission(s): 1621    Accepted Submission(s): 423<br /><br /><br />Problem Description当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有

hqd_acm的专栏 1703

OpenCV-Python实战(3)——OpenCV中绘制图形与文本

OpenCV 是一个的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。本文介绍了 OpenCV 提供的与绘制图形和文本相关的函数。在图形方面,我们了解了如何绘制基本图形(直线、矩形和圆形等)以及高级图形(剪裁线、箭头、椭圆和多边形)。在文本方面,我们了解了如何绘制文本以及 OpenCV 库中的所有可用字体。

盼小辉丶的博客 2万+

110、3A 端到端调试:从 ISP register dump 到主观画质的完整调试流程

文章摘要 本文分享了ISP 3A(AE/AWB/AF)端到端调试的实战经验,通过具体案例解析常见问题排查方法。从硬件链路确认、寄存器dump分析、算法闭环验证到主观画质调优,提出了一套系统化调试流程。重点包括:如何通过示波器和寄存器抓包定位时序问题,AWB调试中black level校正的关键作用,AF闭环控制中hall传感器反馈的重要性,以及算法与硬件联调的"三板斧"方法论。作者强调3A调试本质是系统工程,需结合物理层信号测量、数据通路验证和算法状态跟踪,避免陷入局部优化陷阱。

sundong_81的博客 58

用c++撸一个小病毒

用c++撸一个小病毒

songhy_china的博客 1079

基于python CNN卷积神经网络模型实现6类别垃圾分类 毕业设计 附完整代码数据

基于python CNN卷积神经网络模型实现6类别垃圾分类 毕业设计 附完整代码数据

1665

【AC自动机】HDU - 2896 病毒侵袭(字典树应该开多大的数组???)

无所谓 慢慢来 迷宫一样的未来

L_X_ 337

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025

YOLO系列算法改进 | 自研篇 | C3k2融合SEFN空间增强前馈网络模块 | 去模糊和提升图像细节特征,精度涨点!| WACV 2025 (以YOLO26最新目标检测模型为基础,C3k2融合SEFN空间增强前馈网络模块改进Backbone)

2502_91881744的博客 239

066、AR 应用中虚拟物体漂移抖动?IMU 融合 + 光流追踪的视觉里程计优化方案

AR应用中虚拟物体漂移抖动优化方案 摘要:针对AR应用中虚拟物体漂移抖动问题,提出一种IMU融合与光流追踪的视觉里程计优化方案。关键点包括:1) 采用IMU预积分技术处理高频噪声,通过中值积分计算帧间相对运动约束;2) 使用金字塔LK光流追踪像素运动,通过中值偏差法剔除异常值;3) 构建10帧滑动窗口的紧耦合优化框架,将IMU预积分约束和光流重投影约束联合优化。实验表明,该方法有效解决了时间戳未对齐导致的"跳舞箭头"现象,在手机端实现稳定30fps的AR定位精度,漂移误差降低至厘米级。特别提醒:IMU与视觉

ai技术增长的博客 161

HDU-3065 病毒侵袭持续中 AC自动机 数组模拟

小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家...

Kuguotao的博客 237

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU 3065 病毒侵袭持续中(AC自动机 数组模板)

病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15967 Accepted Submission(s): 5415Problem Description 小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中

南风古 343

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

HOJ 2896 病毒侵袭(AC自动机,模板题)

AC自动机,模板题 本题要点: 1、把多个病毒串,建立 trie, 其中数组virus_id[k] 表示节点是k的点对应的病毒编号 2、建立 fail 数组 3、有m个文本串,没依次查询,都会把数组virus_id[k]对应的值赋值为0,防止重复遍历。 所以,查询完后,需要把数组 virus_id 的数据恢复原来的样子。我这里用的很 low 的方法,直接开一个 数组 virus_id 的副本 virus_id1 。 4、一些注意的地方: 字符串是可见字符,并不只是小写字母。 字典树是 trie[MaxL]

qq_38232157的博客 225

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU 2896 I - 病毒侵袭 AC自动机 数组模拟

当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~  但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找出来。当然,谁都知道这是不可能的。小t却执意要完成这不能的任务,他说:...

Kuguotao的博客 290

J - 病毒侵袭持续中(AC自动机--数组)

J - 病毒侵袭持续中  HDU - 3065  小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网...

team39的博客 297

HDU 2896 病毒侵袭 (AC自动机数组型模板)

http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 26598    Accepted Submission(s):

Accepted 548

【HDU 2896】病毒侵袭(AC自动机-用数组完成)

题目:点击打开题目链接 Problem Description: 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找...

innocence的博客 337

病毒侵袭 HDU - 2896(AC自动机数组模拟指针)

病毒侵袭 HDU - 2896 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找出来。当然,谁都知道这是不可能的。小...

codeswarrior的博客 217

hdu2896 病毒侵袭 ac自动机

题目链接:病毒侵袭 题解:正常建立ac自动机,然后再匹配的时候,用vis数组标记看串有没有匹配过,统计答案就可以了,这题卡空间特别紧。我用memset初始化足够的空间就mle 好像申请空间,oj并不马上分配,放你真正使用才算你使用了。 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int ma...

weixin_30954607的博客 170

病毒侵袭持续中 HDU - 3065 (AC自动机静态数组版本)

题目链接 病毒侵袭持续中 HDU - 3065 题目 小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个...

EnjoyingAC的博客 335

病毒侵袭 HDU - 2896 (AC自动机静态数组版本)

题目链接 病毒侵袭 HDU - 2896 题目 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ 但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找出来。当然,...

EnjoyingAC的博客 240

HDU3065 病毒侵袭持续中(AC自动机或后缀数组)

传送门 思路:将所有特征码建成一个AC自动机,然后查找就行了,找的时候直接找完也不会超时,因为模式串太短了(不超过50个字符),再长一点可以考虑树DP。 如果用后缀数组的话,我觉得可以O(NlogM)O(NlogM)(N为串的总长度,M为模式串最长长度)来Build。然后在Height数组里二分答案O(TlogM)O(TlogM)(T为模式串个数,一次lower_bound,一次upper_bo

geng4512的专栏 616
上一篇: Keywords Search(AC自动机-结构体数组)
下一篇: J - 病毒侵袭持续中(AC自动机--数组)
team39
博客等级 码龄9年 80粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值