FZU 1926 填空(KMP)

本文介绍了一种利用Hash值与KMP算法解决文本填空查询问题的方法。通过将待查询字符串转换为Hash值,并针对空白字符采用特殊Hash值进行匹配,使用KMP算法在原文中高效查找。该方案适用于文本查询场景。
题目链接
题意

给你一篇由小写字母组成的文章,再给你一系列查询。
每次查询给你一系列由小写字母和_组成的字符串,_是要填空的区域,问能否根据文章填空,即填空后找到原文。

思路

将每个字符串转化为一个hash值,然后对要查找串的一系列hash值,在原文中用kmp查找,_ 转化为一个无冲突的hash值,比如 − 1 -1 1,kmp和求nxt数组时将 − 1 -1 1设为万能匹配即可。匹配成功即能填空

代码
#include <stdio.h>
#include <string.h>
using namespace std;

int Rd(int &a){return scanf("%d",&a);}
int rd(){int tmp; scanf("%d",&tmp); return tmp;}

int fq[1005], want[1005], nxt[1005];
char s[1005];

void getnxt(int len)
{
    nxt[1] = 0;
    int i = 1, j = 0;
    while(i <= len)
    {
        if(j == 0 || want[i] == want[j] || want[i] == -1 || want[j] == -1) nxt[++i] = ++j;
        else j = nxt[j];
    }
}

int kmp(int n, int m)
{
    int i = 1, j = 1;
    while(i <= n)
    {
        if(j == 0 || fq[i] == want[j] || want[j] == -1) ++i, ++j;
        else j = nxt[j];
        if(j == m+1) return 1;
    }
    return 0;
}

int main()
{
    for(int t = rd(), ca = 1; ca <= t; ++ca)
    {
        int tot = 0;
        while(scanf("%s",s), s[0] != '@')
        {
            int len = strlen(s);
            int tmp = 0;
            for(int i = 0; i < len; ++i)
            {
                tmp += s[i]-'a';
                tmp *= 26;
            }
            fq[++tot] = tmp;
        }
        int m = rd();
        printf("Case %d:\n",ca);
        while(m--)
        {
            int ind = 0;
            while(scanf("%s",s), s[0] != '@')
            {
                if(s[0] == '_')
                {
                    want[++ind] = -1;
                    continue;
                }
                int len = strlen(s);
                int tmp = 0;
                for(int i = 0; i < len; ++i)
                {
                    tmp += s[i]-'a';
                    tmp *= 26;
                }
                want[++ind] = tmp;
            }
            getnxt(ind);
            printf("%s\n",kmp(tot,ind)?"YES":"NO");
        }
    }
    return 0;
}
内容概要:本文详细介绍了一个基于黏菌优化算法(SMA)优化的Transformer-LSTM组合模型在多变量回归预测中的完整项目实例。项目通过融合Transformer的全局特征提取能力与LSTM的局部时序建模优势,构建层次化混合模型,并引入SMA算法实现超参数自动寻优,提升模型性能与泛化能力。项目涵盖数据预处理、模型设计、训练优化、结果评估、GUI可视化界面开发及工程化部署全流程,配套完整代码与目录结构设计,支持端到端自动化建模与跨平台应用。; 适合人群:具备一定机器学习和深度学习基础,熟悉Python编程与PyTorch框架,从事数据科学、人工智能研发或工程落地的相关技术人员,尤其是工作1-3年希望提升模型自动化与实战能力的研发人员。; 使用场景及目标:①应用于智能制造、金融风控、智慧医疗、能源管理、气象预测、智能交通等多变量时间序列预测场景;②掌握Transformer与LSTM融合建模方法;③学习SMA等群体智能算法在深度学习超参数优化中的实际应用;④实现从数据处理到模型部署的全流程自动化开发。; 阅读建议:建议结合文档中的代码示例与GUI实现部分动手实践,重点关注模型架构设计、SMA优化机制和训练流程细节,配合可视化分析深入理解模型行为。同时可扩展尝试不同数据集和优化算法,提升对复杂时序预测任务的综合把控能力。
【源码免费下载链接】:https://renmaiwang.cn/s/bu4rv 在MATLAB中,散点图是一种非常常用的可视化工具,它能够帮助我们理解两个或多个变量之间的关系。散点图通过在二维平面上用点的位置来表示数据,其中x轴和y轴分别代表不同的变量,点的位置则对应着数据点在两个变量上的值。这种图表在数据分析、科学研究以及工程应用中都有着广泛的应用。标题"liwei.zip_matlab散点图_matlab画散点_matlab画散点图_散点图"表明这个压缩包包含了与使用MATLAB绘制散点图相关的资源。可能包含一个MATLAB脚本文件(liwei.m)和一个图像文件(B.jpg),前者是用于创建散点图的代码,后者可能是运行脚本后生成的示例散点图。描述中的"画多张散点图,虽然简单点,但很实用啊,希望对大家能有帮助,哈哈"暗示了这个MATLAB脚本可能不仅展示了如何绘制单个散点图,还可能涉及如何生成多个散点图或者在一个图形窗口内绘制多组数据。这样的功能对于比较不同数据集或展示变量间复杂关系非常有用。在MATLAB中,绘制散点图的基本命令是`scatter`。例如,如果我们有两个向量`x`和`y`,我们可以用以下代码创建一个简单的散点图:```matlabx = 1:10; % 创建一个1到10的向量y = x.^2; % y的值为x的平方scatter(x, y); % 绘制散点图````scatter`函数可以接受额外的参数,比如颜色、大小和标记样式,以定制散点的外观。例如,我们可以为不同的数据集使用不同的颜色:```matlabx1 = 1:5;y1 = x1.^2;x2 = 6:10;y2 = x2.^3;colors = {r, b}; % 设置两种颜色scatter(x1, y1, r); % 绘制第一组数据,红色hold on; % 保持当前图形,允许在同一图上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值