ZOJ 3430 Detect the Virus(AC自动机+解码)

深入解析poi-tl自定义表格渲染插件中的多级子循环实现 本文深入解析了poi-tl自定义表格渲染插件中的多级子循环实现,详细介绍了其在处理复杂业务数据时的核心价值、实现原理及实战技巧。通过多级子循环机制,开发者可以高效地将层级数据结构渲染到Word表格中,显著提升代码简洁性和维护效率。文章还分享了性能优化和异常处理经验,帮助开发者更好地应用该插件。 阅读详情

超级传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430


本题思路清晰,不过解码确实繁琐,看来自己代码能力还有待加强。

需要注意几个点:解码后的ASCII字符的范围是0~255,而且可能包含'\0',不能用char来存,最好用int。


代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>

#define STATIC_AC_MOTON

using namespace std;

typedef int Type;

const int char_count = 256;
const char base_char = 0;

typedef struct __node
{
    Type val;
    int node_data;
    int vis;
    struct __node* next[char_count];
    struct __node* parent;
    struct __node* prefix;
}
Node;

#ifdef DYNAMIC_AC_MOTON
Node* rt;
#endif

#ifdef STATIC_AC_MOTON
const int max_node_count = 512 * 64 + 10;
Node node[max_node_count];
Node* rt = &node[0];
int node_count = 1;
#endif

int text[8 * 2048 + 10];
char _str[2048 + 10];

void createTree(Node** root)
{
#ifdef DYNAMIC_AC_MOTON
    *root = (Node*)malloc(sizeof(Node));
#endif
    (*root)->val = 0;
    (*root)->parent = NULL;
    (*root)->prefix = NULL;
    (*root)->vis = 0;
    (*root)->node_data = base_char;
    for (int i = 0; i < char_count; i++)
        (*root)->next[i] = NULL;
}

void deleteTree(Node* root)
{
#ifdef DYNAMIC_AC_MOTON
    if (root == NULL)
        return;
    for (int i = 0; i < char_count; i++)
    {
        if (root->next[i] != NULL)
            deleteTree(root->next[i]);
    }
    free(root);
#endif
#ifdef STATIC_AC_MOTON
    node_count = 1;
#endif
}

void insert(Node** root, int* str, int n)
{
    for (int i = 0; i < n; i++)
    {
        if ((*root)->next[str[i] - base_char] == NULL)
        {
#ifdef DYNAMIC_AC_MOTON
            (*root)->next[str[i] - base_char] = (Node*)malloc(sizeof(Node));
#endif
#ifdef STATIC_AC_MOTON
            (*root)->next[str[i] - base_char] = &node[node_count++];
#endif

            (*root)->next[str[i] - base_char]->parent = *root;
            root = &((*root)->next[str[i] - base_char]);
            (*root)->val = 0;
            (*root)->vis = 0;

            for (int j = 0; j < char_count; j++)
                (*root)->next[j] = NULL;
        }
        else
            root = &((*root)->next[str[i] - base_char]);

        (*root)->node_data = str[i];

        if (i == n - 1)
            (*root)->val++;
    }
}

int query(Node* root, int* text, int n)
{
    int count = 0;

    Node* p = root;
    int pos = 0;

    do
    {
        while (p != NULL && pos < n)
        {
            Node* cnt = p;
            while (cnt != root && !cnt->vis)
            {
                cnt->vis = 1;
                count += cnt->val;
                cnt = cnt->prefix;
            }

            if (p->next[text[pos] - base_char] != NULL)
            {
                p = p->next[text[pos] - base_char];
                pos++;
            }
            else
                p = p->prefix;
        }

        if (p == NULL)
        {
            p = root;
            pos++;
        }
        if (pos == n)
        {
            Node* cnt = p;
            while (cnt != root && !cnt->vis)
            {
                cnt->vis = 1;
                count += cnt->val;
                cnt = cnt->prefix;
            }
        }
    }
    while (pos < n);

    return count;
}

void make_prefix_pointer(Node* root)
{
    queue<Node*> q;
    q.push(root);

    while (!q.empty())
    {
        Node* cnt = q.front();
        q.pop();

        for (int i = 0; i < char_count; i++)
        {
            if (cnt->next[i] != NULL)
                q.push(cnt->next[i]);
        }

        if (cnt == root)
        {
            cnt->prefix = NULL;
            continue;
        }

        if (cnt->parent == root)
        {
            cnt->prefix = root;
            continue;
        }

        Node* pre = cnt->parent->prefix;

        while (pre != NULL)
        {
            if (pre->next[cnt->node_data - base_char] != NULL)
            {
                cnt->prefix = pre->next[cnt->node_data - base_char];
                break;
            }
            else
                pre = pre->prefix;
        }

        if (pre == NULL)
            cnt->prefix = root;
    }
}

void clearVisFlag(Node* root)
{
#ifdef DYNAMIC_AC_MOTON
    if (root == NULL)
        return;
    for (int i = 0; i < char_count; i++)
        clearVisFlag(root->next[i]);
    root->vis = 0;
#endif
#ifdef STATIC_AC_MOTON
    for (int i = 0; i < node_count; i++)
        node[i].vis = 0;
#endif
}

int decodeBase64ToASCII(int* des, char* src)
{
    int len = strlen(src);
    int desIndex = 0;
    int incNum = 0;
    int zeroBitsCount = 0;
    int bits[6];

    for (int i = 0; i < len; i++)
    {
        if (src[i] >= 'A' && src[i] <= 'Z')
            incNum = src[i] - 'A';
        else if (src[i] >= 'a' && src[i] <= 'z')
            incNum = src[i] - 'a' + 26;
        else if (src[i] >= '0' && src[i] <= '9')
            incNum = src[i] - '0' + 52;
        else if (src[i] == '+')
            incNum = 62;
        else if (src[i] == '/')
            incNum = 63;
        else if (src[i] == '=')
        {
            zeroBitsCount = len - i;
            break;
        }

        for (int j = 0; j < 6; j++)
            bits[j] = 0;
        int cntBitIndex = 5;
        while (incNum)
        {
            bits[cntBitIndex--] = incNum % 2;
            incNum >>= 1;
        }

        for (int j = 0; j < 6; j++)
            des[desIndex + j] = bits[j] + '0';
        desIndex += 6;
    }
    desIndex -= zeroBitsCount << 1;

    for (int i = 0; i < desIndex; i += 8)
    {
        int val = 0;
        for (int j = 7; j >= 0; j--)
            val += (des[i + j] - '0') * (1 << (7 - j));
        des[i / 8] = val;
    }
    return desIndex / 8;
}

int main()
{
    int n, m;

    while (scanf("%d", &n) > 0)
    {
        createTree(&rt);
        for (int i = 0; i < n; i++)
        {
            scanf("%s", _str);
            int len = decodeBase64ToASCII(text, _str);
            insert(&rt, text, len);
        }
        make_prefix_pointer(rt);

        scanf("%d", &m);
        for (int i = 0; i < m; i++)
        {
            scanf("%s", _str);
            int len = decodeBase64ToASCII(text, _str);
            printf("%d\n", n ? query(rt, text, len) : 0);
            clearVisFlag(rt);
        }
        printf("\n");
        deleteTree(rt);
    }
    return 0;
}


【原创教程】AB上位机FactoryTalk View的使用教程 条形图主要的作用就是根据绑定的变量中数字大小的变化来反映到图形中,随着数字的增加填充的颜色不断上升或随着数字的减小填充的颜色不断下降。绘图功能中常用的功能主要是:数字输入,数字输出,字符输入,字符输出,各种类型的的按钮,条状图,各类控件,系统自带的图形库。颜色指的是根据PLC变量的变化来改变图形的颜色,可以绑定BOOL量来显示两种颜色,也可以绑定字节,字,双字等来显示多种颜色。打开软件后右键点击画面选项然后点击新建则新建出一个画面,画面画好后点击保存并更改标题后新建的画面则会出现在画面选项的文件夹下。 阅读详情

相关推荐

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 405

AC自动机+base64解码 zoj3430 Detect the Virus

传送门:点击打开链接 题意:告诉你邮件内容,告诉你病毒,问内容里有多少种类的病毒。一听就知道是裸AC自动机,,但是有两个很恶心的地方。。首先是base64解码,还是第一次手撸这个也是麻烦..另外一个很容易弄错的地方就是,有的语言字节是从0~255,其实C语言的字节是从0~127是正数,最高位表示的是负数了...所以说,base64解码后,可能有的字节是大于127的,所以我们不能用char类型来存

qwb的博客 911

京东商品多维特征提取:基于时空大模型的实时库存预测接口设计

在电商行业,库存管理是供应链的核心环节之一。库存水平过高会导致资金占用、仓储成本增加,而库存水平过低则可能引发缺货风险,影响客户满意度和平台声誉。京东作为中国领先的电商平台,拥有海量的商品数据和复杂的业务场景,传统的库存预测方法难以应对市场动态变化和业务需求。时空大模型作为一种融合时间序列分析和空间特征提取的前沿技术,能够捕捉商品多维特征在时空维度上的变化规律,为实时库存预测提供更精准的决策依据。

FB13713612741的博客 954

ZOJ - 3430 Detect the Virus —— AC自动机、解码

题目链接:https://vjudge.net/problem/ZOJ-3430 Detect the VirusTime Limit:2 Seconds Memory Limit:65536 KB One day, Nobita found that his computer is extremely slow. After several hours' wor...

alince20008的博客 201

保姆级教程:用Kvaser DB Editor从零创建你的第一个DBC文件(附CAN信号属性详解)

本文提供了一份详细的Kvaser DB Editor教程,指导用户从零开始创建DBC文件,并深入解析CAN信号属性的关键设置。通过步骤清晰的安装指南、信号属性配置详解和实用技巧,帮助工程师和学生快速掌握CAN总线通信的核心工具,提升工作效率。

weixin_27076351的博客 250

从ADS到HFSS:耦合线带通滤波器的设计与模型转换实战

本文详细介绍了耦合线带通滤波器的完整设计流程,重点阐述了从ADS电路级快速优化到HFSS三维电磁场精确验证的模型转换实战方法。通过对比ADS理想模型仿真与HFSS全波仿真结果,指导读者进行参数校准与迭代优化,并分享了关键的板材选择、加工误差及端口设置等避坑指南,确保设计性能与实物测试高度一致。

weixin_29290863的博客 344

ZOJ 3430 Detect the Virus 【AC自动机+解码】

解码的那些事儿,不多说。 注意解码后的结果各种情况都有,用整数数组存储,char数组会超char类型的范围(这个事最蛋疼的啊)建立自动机的时候不能用0来判断结束。 #include #include #include #include #include #include using namespace std; vector ans; struct AC_Automata

智障 1468

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

ZOJ 3430 Detect the Virus

解码后就是裸AC自动机。。。

long long ago 1472

游戏大厂状态同步与帧同步技术全解析——让虚拟世界万物协同的“时间齿轮”

本文深入解析了大厂游戏开发中的两种核心同步技术:状态同步和帧同步。状态同步适合大型MMO和FPS游戏,由服务端计算并广播世界状态;帧同步则通过统一操作输入实现MOBA和RTS游戏的绝对公平。文章详细比较了两者的差异、适用场景和底层实现原理,并揭秘了《王者荣耀》《PUBG》等热门游戏的同步机制。同时探讨了本地预测、延迟补偿、防作弊等关键技术,以及未来AI和云游戏带来的同步新挑战,为开发者提供了全面的技术参考和实践指南。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 920

手把手带你实现DAF-Net:零代码基础入门红外与可见光图像融合(从理论到实战)

本文介绍了红外与可见光图像融合技术及DAF-Net网络的应用。红外图像能捕捉热源但缺乏细节,可见光图像纹理丰富但在低光环境下表现不佳。DAF-Net采用双分支特征提取和动态注意力融合架构,能智能分配特征权重实现优势互补。文章详细讲解了环境配置、数据集准备(如TNO数据集)和预处理方法,并提供了DAF-Net的核心代码实现,包括特征提取、注意力融合和图像重建模块。通过该技术可在安防、自动驾驶等领域获得更优质的融合图像,提升视觉感知能力。

m0_71589036的博客 229

ZOJ 3430 Detect the Virus AC自动机

题目大意: 就是现在给出一些病毒样本的字符串,sh

Gatevin的专栏 840

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

Detect the Virus ZOJ - 3430 ac自动机+模拟

一、内容 One day, Nobita found that his computer is extremely slow. After several hours' work, he finally found that it was a virus that made his poor computer slow and the virus was activated by a misop...

Tizzi的博客 810

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[AC自动机]ZOJ.3430 Detect the Virus

先解码,一定注意因为这个码的范围在0~255之间,char型存不下,所以改为int型存储。因为没有在每次query使memset vis为0,wa了一个小时! #include<bits/stdc++.h> #define debug(x) cout<<#x<<" is "<<x<<endl #define pb push_back using namespace std; const int N = 5e4 + 5; const int char

我们仍未知道那天所看见的花的名字。 172

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ZOJ 3430 Detect the Virus(AC自动机,你WA疯了就进来瞧瞧.)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 WA: 1.每个串只记一次,不要记多次 2.忽略等号不转码直接跑AC自动机会错,例子: 转码前: 1 aGVs 1 aGhlbA== ans = 0 -------------- 转码后: 1 hel 1 hhel ans = 1 3.ch...

shadiao.的博客 161

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ZOJ 3430 Detect the Virus(AC自动机+字符串转换)

ZOJ 3430 Detect the Virus(AC自动机) http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3430 题意:给你多个模板串,和一个文本串,现在问你文本串中出现了几个模板串。但是模板串和文本串都是用64位编码的。 分析:由于数据都是64位编码的,所以需要先把模板串和文本串解码成ASCII字符串形式。

code 1958

ZOJ-3430 Detect the Virus(解码后最好用整数存)

题意:给出n个模式串,先将其解码;再给出m个主串,判断每个主串中出现了几个模式串(判断每个模式串是否出现过)。 WA1:没注意到解码后字符范围0~255; WAWAWAWA…:参考别人的解码后存字符,WA了很多次,后将解码存为int就过了 丑の代码: #include <cstdio> #include <queue> #include <cstring> using namespace std; const int N = 5e4 + 5; int trie[N][26

qq_25243147的博客 132

ZOJ-3430-Detect the Virus(AC自动机+字符串+位运算)

Detect the Virus Nobita did use an outstanding anti-virus software, however, for some strange reason, this software did not check email attachments. Now Nobita decide to detect viruses in emails by himself. To detect an virus, a virus sample (several binar

qq_43461168的博客 284

病毒入侵M - Detect the Virus ZOJ - 3430 (位运算,AC自动机)

One day, Nobita found that his computer is extremely slow. After several hours' work, he finally found that it was a virus that made his poor computer slow and the virus was acti...

dengyan1183的博客 155

【ZOJ 3430 Detect the Virus】 AC自动机

ZOJ3430 题意就是给你一个加密的单词,加密方式就是先把字符按照ASCII表转为2进制,再截取6个为一段转为10进制,再去表中改为对应字符。 我们只需要把所有关键字和文本串都解码之后,就是一个最朴素的AC自动机了。 密文转换方法是向kuangbin大神学习的,我们通过思考可以发现,解码的过程就是把四个字符转换为3个字符的过程,所以我们只要对加密串进行一些二进制操作,就可以直接将24位二进...

lajiyuan的博客 356

ZOJ 3430 Detect the Virus(AC自动机)

给出 n 个模式串以 base64 编码,再给出 m 个文本串以 base64 编码,问这 m 个文本串中出现过多少次模式串 题目若是没有以 base64 编码为条件就是一道 AC自动机的模板题,但是区区一个编码就变成了自闭题 首先搞清楚 base64 编码的规则,题目中已经给出了 hello 的样例,就是将 hello 的 acsll 码转化为二进制,然后每 6 位按题目中给出的表进行对字符进行转化,= 忽略即可 而题目要求我们求文本串的匹配,自然要将给出的 base64 进行解码,由...

C_Dreamy的博客 389

zoj 3430 Detect the Virus(AC自动机)

Detect the Virus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day, Nobita found that his computer is extremely slow. After several hours' work, he finally found that it was a virus that

LYHVOYAGE的专栏 2344

ZOJ 3430 Detect the Virus (AC自动机)

题目链接:Detect the Virus 题意:n个模式串,一个文本串,问文本串包含几个模式串。 解析:解码 + AC自动机。        解码过程:先将字符串转换成ASCII 然后根据相应的ASCII 转换成二进制,每一个是6位,不够加0,然后取8位为一个字符,求得的字符串为要的字符串。 PS:注意sigma_size = 256 AC代码:

sxk 855

ZOJ 3430 Detect the Virus(AC自动机 + 模拟)题解

题意:问你主串有几种模式串。但是所有串都是加密的,先解码。解码过程为:先把串按照他给的映射表变成6位数二进制数,然后首尾衔接变成二进制长串,再8位8位取变成新的数,不够的补0。因为最多可能到255,所以不能用char存,要用int。 思路:模拟乱搞一下,加个板子完事。 代码: #include<cmath> #include<set> #includ...

weixin_30412577的博客 123
上一篇: Trie引发的血案——再论参数
下一篇: 用bis和bic实现所有位级操作
Uranux
博客等级 码龄15年 16粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值