HDU 4749 & POJ 3167 kmp变形

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码) 本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。 阅读详情

HDU4749

题意

给定一个主串 T 和模式串 P,问 T 有多少个不重合的子串与 P 匹配。

在这里,串 a 与串 b 匹配的含义是,

∀i,j,1≤i,j≤n,⎧⎩⎨a[i]<a[j]↔b[i]<b[j]a[i]==a[j]↔b[i]==b[j]a[i]>a[j]↔b[i]>b[j]

参考

HDU 4749 && POJ 3167 KMP ——九野的博客

思路

最原始的匹配含义是两字符相同,因此比较时即比较 T[i]==P[j] ,现今改了匹配的含义,只需要对应的去修改比较方式即可。

那么怎么 check 当前的 T[i] 与 P[j] 是否匹配呢?只需检查前面已经匹配成功的一段中分别比 T[i] 小的和比 P[j] 小的数的数量是否相同,以及相等的是否相同。

求失配数组也是同理。

因为 K 的范围只有 25,所以可以直接暴力预处理记录下 eq[i][j] 与 lt[i][j] ,分别意为在第 i 个位置及以前与 j 相等的或者比 j 小的有多少个。

那么不重合的子串这个要求呢?我们可以贪心地去匹配,如果当前这段可行,就一定匹配上这段。否则,开始的位置更迟只会消耗掉之后其他子串进行匹配的可能性。一旦匹配上了,就再从模式串的开始位置进行匹配。

这道题要注意的问题是下标的问题,稍微有点绕;kmp 也不是最常规的那种写法。

是道好题。

Code

#include <bits/stdc++.h>
#define K 25
#define maxn 100010
using namespace std;
typedef long long LL;
int n, m, k;
int eq1[maxn][K+10], eq2[maxn][K+10], lt1[maxn][K+10], lt2[maxn][K+10], f[maxn], x[maxn], a[maxn];
bool cmp(int i, int j) { return x[i] < x[j]; }
void init(int* x, int eq[maxn][K+10], int lt[maxn][K+10], int n) {
    for (int i = 1; i <= n; ++i) {
        memcpy(eq[i], eq[i-1], sizeof(eq[0]));
        ++eq[i][x[i]];
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= K; ++j) lt[i][j] = lt[i][j-1] + eq[i][j];
    }
}
bool match1(int i, int j, int x, int y) {
    return eq2[i][x] - eq2[i-j][x] == eq2[j][y] && lt2[i][x-1] - lt2[i-j][x-1] == lt2[j][y-1];
}
bool match2(int i, int j, int x, int y) {
    return eq1[i][x] - eq1[i-j][x] == eq2[j][y] && lt1[i][x-1] - lt1[i-j][x-1] == lt2[j][y-1];
}
void getfail(int* P) {
    int j = 0; f[1] = 0;
    for (int i = 1; i <= m; ) {
        if (!j || match1(i, j, P[i], P[j])) f[++i] = ++j;
        else j = f[j];
    }
}
int cnt;
void kmp(int* T, int* P) {
    int j = 1;
    for (int i = 0; i <= n; ) {
        if (!j || match2(i, j, T[i], P[j])) ++j, ++i;
        else j = f[j];
        if (j == m + 1) ++cnt, j = 1;
    }
}
void init() {
    memset(x, 0, sizeof(x)); memset(a, 0, sizeof(a)); memset(f, 0, sizeof(f));
    memset(eq1, 0, sizeof eq1); memset(eq2, 0, sizeof eq2);
    memset(lt1, 0, sizeof lt1); memset(lt2, 0, sizeof lt2);
}
void work() {
    init();
    for (int i = 1; i <= n; ++i) scanf("%d", &x[i]); init(x, eq1, lt1, n);
    for (int i = 1; i <= m; ++i) scanf("%d", &a[i]); init(a, eq2, lt2, m);
    getfail(a);
    int cur = 1, p; cnt = 0;
    kmp(x, a);
    printf("%d\n", cnt);
}
int main() {
    while (scanf("%d%d%d", &n, &m, &k) != EOF) work();
    return 0;
}

POJ 3167

题意

基本同上,子串可以重复

思路

基本同上。

匹配成功后的跳转仍然借助失配数组进行跳转。

Code

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#define K 25
#define maxn 100010
using namespace std;
typedef long long LL;
vector<int> ans;
int n, m, k, cnt;
int eq1[maxn][K+10], eq2[maxn][K+10], lt1[maxn][K+10], lt2[maxn][K+10], f[maxn], x[maxn], a[maxn];
bool cmp(int i, int j) { return x[i] < x[j]; }
void init(int* x, int eq[maxn][K+10], int lt[maxn][K+10], int n) {
    for (int i = 1; i <= n; ++i) {
        memcpy(eq[i], eq[i-1], sizeof(eq[0]));
        ++eq[i][x[i]];
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= K; ++j) lt[i][j] = lt[i][j-1] + eq[i][j];
    }
}
bool match1(int i, int j, int x, int y) {
    return eq2[i][x] - eq2[i-j][x] == eq2[j][y] && lt2[i][x-1] - lt2[i-j][x-1] == lt2[j][y-1];
}
bool match2(int i, int j, int x, int y) {
    return eq1[i][x] - eq1[i-j][x] == eq2[j][y] && lt1[i][x-1] - lt1[i-j][x-1] == lt2[j][y-1];
}
void getfail(int* P) {
    int j = 0; f[1] = 0;
    for (int i = 1; i <= m; ) {
        if (!j || match1(i, j, P[i], P[j])) f[++i] = ++j;
        else j = f[j];
    }
}
void kmp(int* T, int* P) {
    int j = 1;
    for (int i = 1; i <= n; ) {
        if (!j || match2(i, j, T[i], P[j])) ++j, ++i;
        else j = f[j];
        if (j == m + 1) {
            ans.push_back(i-m);
            ++cnt;
            j = f[j];
        }
    }
}
void init() {
    memset(x, 0, sizeof(x)); memset(a, 0, sizeof(a)); memset(f, 0, sizeof(f));
    memset(eq1, 0, sizeof eq1); memset(eq2, 0, sizeof eq2);
    memset(lt1, 0, sizeof lt1); memset(lt2, 0, sizeof lt2);
    ans.clear();
}
void work() {
    init();
    for (int i = 1; i <= n; ++i) scanf("%d", &x[i]); init(x, eq1, lt1, n);
    for (int i = 1; i <= m; ++i) scanf("%d", &a[i]); init(a, eq2, lt2, m);
    getfail(a);
    cnt = 0;
    kmp(x, a);
    printf("%d\n", cnt);
    for (vector<int>::iterator it = ans.begin(); it != ans.end(); ++it) printf("%d\n", *it);
}
int main() {
    while (scanf("%d%d%d", &n, &m, &k) != EOF) work();
    return 0;
}
实践指南——【SPSS操作解析】线性混合效应模型在重复测量数据中的应用 本文详细解析了线性混合效应模型在重复测量数据分析中的应用,并提供了SPSS操作指南。文章阐述了该模型如何通过区分固定效应与随机效应,有效处理数据非独立性和缺失值问题,从而获得更可靠的统计推断。 阅读详情

相关推荐

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

hdu 4749 Parade Show ( kmp )

hdu 4749 Parade Show ( kmp ) 题意:给出两个数列(可以看成串),问最多能在串1中找出几个不重叠的substring,使得这些substring的元素的相对大小关系与串2相同(显然,长度也要与串2相同)。 解题思路:kmp。。比赛的时候有想到这个思路,但一直不知道怎么搞定这个相对大小关系。其实很简单。。 count(AiAn+1)=count(BiBn+1),i

No__stop 2104

专访高性能计算专家赵开勇:无人机/机器人开发实战,如何优化深度学习?

从能够自主飞行的无人机,到能和小朋友玩物体识别等游戏的机器人,极客们对智能设备追求没有止境。除了轻巧的体积、超长的续航,更重要的是要有一个智能的“大脑”,来实现人类能够想得到的人机交互,或者智能化的自主决策和行为动作,毫无疑问强大的深度学习能力不可或缺。那么,拒绝束缚人类想象力的嵌入式智能设备,其开发工作需要什么样的环境和工具?开发者进行相关开发的可行思路是什么?近日,优快云记者就此专访了智能设...

happytofly的博客 3509

HDU 4749 KMP... 算是KMP 吧。。。

HDU4749 一道稍微饶了点弯子的KMP 题目。。。 给定一个模式串,要求匹配的字符串中字符的两两大小关系与模式串相同 比如: 模式串 1 3 5 2 4 6 匹配串 9 12 16 10 14 19 就是一组合法的匹配。 其实没什么复杂的。。 顺序处理模式串当中的每一个字符,处理出: (如果该字符之前出现过)在其前面等于该字符的字符位置  (如果该字符没出现过)或者是大

某卖萌喵星人的代码小窝 1303

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6560

STM32巡线小车PID调参实战:从五路灰度传感器数据到稳定运行的避坑指南

本文详细介绍了STM32巡线小车的PID调参实战,从五路灰度传感器数据处理到PID参数优化,提供了系统化的调试方法和常见问题解决方案。通过加权平均法计算偏移量,逐步调整比例、积分、微分参数,实现小车稳定巡线。文章还涵盖了定时器配置、控制周期优化及高级调试技巧,帮助开发者避开常见陷阱,提升巡线性能。

weixin_42570484的博客 193

HDU 4749 Parade Show 相对匹配的KMP

题目来源:HDU 4749 Parade Show 题意:从长度为n的序列最多能找到多少个不重叠的的连续的子串 和长度位m的序列的相对大小相同  思路:转化成KMP 把原来的字母相同换成一个检测是否相对大小相同的函数 具体参考了http://blog.youkuaiyun.com/no__stop/article/details/11949743 #include #include const i

嗯。 1611

解锁机器人逆运动学算法:从理论到实战

机器人逆运动学,简单来说,就是已知机器人末端执行器(如机械臂的手部、工具等)期望达到的位置和姿态,求解机器人各个关节需要达到的角度或位移的过程。在机器人的实际应用场景中,逆运动学起着不可或缺的作用。以工业制造中的焊接机器人为例,为了完成复杂的焊接任务,焊接头(末端执行器)需要精准地到达工件上的各个焊接点,并保持合适的姿态以确保焊接质量。这时,逆运动学算法就根据焊接点的三维坐标以及焊接头应有的姿态(如角度等),计算出机械臂各个关节的转动角度,从而控制机械臂带动焊接头准确地运动到目标位置。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2052

hdu 4749 (转化的KMP)

//hdu 4749 /* 题意:给出两个数列(可以看成串),问最多能在串1中找出几个不重叠的substring,使得这些substring的元素的相对大小关系与串 2相同(显然,长度也要与串2相同)。 解题思路:kmp。。比赛的时候有想到这个思路,但一直不知道怎么搞定这个相对大小关系。其实很简单。。 count(Ai<An+1)=count(Bi<Bn+1),i=1..n count

zxc的专栏 787

【OpenClaw从入门到精通】第60篇:多智能体协同实战——用“龙虾”搭建你的数字员工团队(2026企业版)

2026年AI Agent企业落地的核心趋势,正从“单Agent单兵作战”转向“多智能体协同组网”。本文以全球开发者先锋大会“百虾大战”真实案例为蓝本,深度拆解OpenClaw多智能体协同的技术内核——三层解耦架构(模型层-技能层-网关层),系统搭建包含项目经理、架构师、执行者、质量把关者的4大核心Agent团队。通过三种主流协作架构对比、全链路配置代码实操、故障自愈实战演练,结合电商新品上架虚拟场景全流程演示,解决企业多Agent部署中的权限隔离、任务协同、运维自治三大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 768

在 FreeStyle SAP UI5 应用里优雅落地 Draft 草稿机制:用 DraftManager 封装 DraftController 的一套实战套路

SAP Fiori应用中,Draft草稿机制是解决业务中断、多人协作和长表单填写等痛点的核心能力。本文提出了一套针对FreeStyle SAP UI5应用的Draft管理方案,通过封装sap.ui.generic.app.transaction.DraftController为DraftManager服务类,将复杂的草稿操作逻辑集中管理。该方案实现了草稿的创建、激活、丢弃等核心功能,使控制器只需调用简单意图式API即可完成操作,同时解决了组件化架构下的上下文切换、统一错误处理等问题。文章还详细介绍了后端Dr

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2751

HDU 4749 Parade Show(KMP)

Parade Show Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 921    Accepted Submission(s): 386 Problem Description   2013 is th

Remilia's 1146

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串

题目链接 Description 给出\(n\)个序列。找出这\(n\)个序列的最长相同子串。 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串。 思路 参考:hzwer. 法一:kmp 在第一个串中枚举答案串的开头位置,与其余\(n-1\)个串做\(kmp\). 法二:后缀数组 将\(n\)个串拼接起来。二分答案\(len\),将\(height\)分组...

ahu12345678的博客 144

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu4749 Parade Show(kmp)

题目链接:点这里!!! 题意: 给定两个数组a(文本串),b(模式串)。问文本串能匹配出多少个模式串(不允许重叠)。"匹配"的意思各自离散化之后的串是一样的。 例如:(20,2,2,5,1,3,21)  与 (10 10 15,1) 。(2,2,5,7)与(10,10,15,1)是匹配的。 数据范围len 题解: 1、首先看到这种题目涉及到模式串的匹配问题,很容易往km

Zsss的博客 419

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hdu 4749 Parade Show(KMP)

题目链接:Parade Show 题目大意:学校要举办一场典礼,要从n个学生中选若干支队伍来,每支队伍有m个人。然后现在将学生的身高划分成k个等级,接着按照学生的顺序给出学生的身高等级,再然后,给出m个人的队伍要求的相对高度。然后要求从n个中间挑选连续的m个人,满足相对高度即可组成一支队伍。问说最多可以组成多少支队伍。 解题思路:KMP算法的变形,只不过在判断相等的时候有点

不慌不忙、不急不躁 1474

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

hdu-4749:Parade Show(kmp模板题)

kmp的略微变形

污miao汪的博客 406

HDU 4749 Parade Show(KMP变形)

题意:有一个文本数列,问可以匹配多少个模式数列(不允许重叠),但这里的“匹配”是这样定义:满足大小关系即可,比如(2,4,4,1)和(33,57,57,2)匹配 思路:明显可以把文本数列和模式数列处理一下,用i与i+1的关系差值代替 再KMP即可,KMP的时候由于不能重叠,所以匹配成功以后,文本串要向后移一位再接着匹配即可 #include #include #include #includ

kalilili的专栏 1069

hdu4749

题意来自 题目大意:学校要举办一场典礼,要从n个学生中选若干支队伍来,每支队伍有m个人。然后现在将学生的身高划分成k个等级,接着按照学生的顺序给出学生的身高等级,再然后,给出m个人的队伍要求的相对高度。然后要求从n个中间挑选连续的m个人,满足相对高度即可组成一支队伍。问说最多可以组成多少支队伍。解题思路:KMP算法的变形,只不过在判断相等的时候有点难办,因为它算的是相对高度,就是同一支队伍中,对应

老李2009 599

hdu 4749

题目很简单,不过题意很难看懂。 就是给一个标准的大小关系的队列,从原队列中找出最多的匹配子队列,感觉就像一个KMP算法+贪心; 不过这个题可能数据有点水把,竟然只要判断相邻的关系就可以A掉; 代码: 1 #include&lt;cstdio&gt; 2 #define maxn 100005 3 using namespace std; 4 int q[maxn],s...

weixin_30622107的博客 158

EOJ——Problem #3167——去掉多余的空白符

去掉多余的空白符 Time limit per test: 1.0 seconds Time limit all tests: 8.0 seconds Memory limit: 256 megabytes 去除一段文字中多余的 whitespace(空格、制表符和换行符),即:当两个单词之间有多个空白符时,只保留第 1 个空白符。 注意:每行首部和 尾部多余的空白符

lose__way的博客 354

字符串 KMP HDU 4749

#include #include /* 10 5 10 2 4 2 4 2 4 2 4 2 4 1 2 1 2 1 题目大意:给一个N,M,K,序列a[],b[],在a[]中找出,和b[]相对大小一样的子序列 求序列的个数(序列不能重复) 思路:KMP,找到满足条件,跳到i+m处 继续往下搜 主要难点在于,如何判断满足条件。 我们只要比较i之前a中a[i]的个数和B中B[i]的个数是

DouBoomFly的博客 409

3167:神奇的辣条

3167: 神奇的辣条 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 710  Solved: 257 [Submit][Status][Web Board] Description 豆豆与牛牛计控学院在学神,每次考试他俩都是前两名。然而两人都想正当第一名。聪明的豆豆发现了成为第一名,是和两人考试前几天吃辣条的数量有关。

越努力,越幸运!!! 882

kmp变形 如何判断第i个字符是否匹配函数 hdu 4749

题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意: 题意:给出两个数字串A、B。问A中有多少不相交的子串a能匹配B。匹配的意思是a中任意两个位置i和j的大小关系和B的这两个位置的大小关系是一样的。 思路:若是完全一模一样的匹配的话那么KMP是很好理解的。那么对于上述的比较方式怎么比较两个串相等呢?对于a的位置j和B的位置i(j...

weixin_34023863的博客 133

Hdu-4749 Parade Show

Description   2013 is the 60 anniversary of Nanjing University of Science and Technology, and today happens to be the anniversary date. On this happy festival, school authority hopes that the

WZJRJ28 518

2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何

题目链接 题意: 圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO, 要在圆上找一点 D,使得 PD + QD 取到最小值。 官方题解: 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r。 Q点同理。 极小化PD+QD可以转化为极小化P'D+Q'D。 当P'Q'与圆有交点时,答案为两点距离

kkkkahlua的博客 1668
上一篇: 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E Maximum Flow
下一篇: HDU 3336 Count the string 所有前缀在串中的出现总次数
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值