YBTOJ:字符匹配(KMP)

文章目录

  • 题目描述
  • 解析
  • 代码

题目描述

请添加图片描述

解析

显然应该要尝试套kmp的板子
关键是如何套
也就是那个判断匹配的条件是什么的问题

本题的关键是当kmp匹配时,匹配位之前的所有位大小关系的顺序都是匹配的,所以我们只需要看当前位即可
考虑对b预处理出3个数组:

id1[i]:[1,i-1]中与i相等的最靠右的数与i的距离
id2[i]:[1,i-1]中比i小的最大的数中最靠右的与i的距离
id3[i]:[1,i-1]中比i大的最小的数中最靠右的与i的距离

(其实不是最靠右也可以啦,只是最靠右容易求)
对于”最靠右“的条件,我们可以先顺序对每个值做一个栈记录这个值出现过的位置,然后逆序求,每次再把自己的值对应的栈弹出一个首元素
“比i小的最大”这样的条件我们可以以值域为关键字建一个双向链表,把一开始就没有的和弹出没有了的值都删除掉,直接找 l 或 r 指针即可

然后就是这个判断。
假设当前A匹配到了[i-j+1,i],B数组匹配到了[1,j]
利用这三个数组,有三个对A失配的条件:

若id1[j]存在且a[i+1-id1[j+1]]!=a[i+1],则失配
若id2[j]存在且a[i+1-id2[j+1]]>=a[i+1],则失配
若id3[j]存在且a[i+1-id3[j+1]]<=a[i+1],则失配

这个画画图还是不难理解的,这是一个充要条件
问题得到解决

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
typedef unsigned long long ull;
const int N = 1e6+100;
const int M=1e7+5;
const int mod=1e9+7;
int n,m;
int s;
int a[N],b[N];
int id1[N],id2[N],id3[N];
vector<int>zhan[N];
int top[N];
int l[N],r[N];
void build(){for(int i=1;i<=s;i++){l[i]=i-1;r[i]=i+1;}l[s+1]=s;r[0]=1;
}
void del(int x){l[r[x]]=l[x];r[l[x]]=r[x];}
int ask(int x,int y){return x<y?x:0;}int p[N];
int ans,st[N];
void solve(){p[1]=0;for(int i=1,j=0;i<=m;i++){while(j&&((ask(id1[j+1],j+1)&&b[i+1-id1[j+1]]!=b[i+1])||(ask(id2[j+1],j+1)&&b[i+1-id2[j+1]]>=b[i+1])||(ask(id3[j+1],j+1)&&b[i+1-id3[j+1]]<=b[i+1]))) j=p[j];if(!((ask(id1[j+1],j+1)&&b[i+1-id1[j+1]]!=b[i+1])||(ask(id2[j+1],j+1)&&b[i+1-id2[j+1]]>=b[i+1])||(ask(id3[j+1],j+1)&&b[i+1-id3[j+1]]<=b[i+1]))) j++;p[i+1]=j;//printf("i=%d p=%d\n",i+1,j);}
}
void kmp(){for(int i=0,j=0;i<=n;i++){while(j&&((ask(id1[j+1],j+1)&&a[i+1-id1[j+1]]!=a[i+1])||(ask(id2[j+1],j+1)&&a[i+1-id2[j+1]]>=a[i+1])||(ask(id3[j+1],j+1)&&a[i+1-id3[j+1]]<=a[i+1]))){//printf("  i+1=%d j=%d %d: %d!=%d? %d: %d>=%d? %d: %d<=%d? \n",i+1,j,ask(id1[j+1],j+1),a[i+1-id1[j+1]],a[i+1],ask(id1[j+1],j+1),a[i+1-id2[j+1]],a[i+1],ask(id2[j+1],j+1),a[i+1-id1[j+1]],a[i+1]);j=p[j];} if(!((ask(id1[j+1],j+1)&&a[i+1-id1[j+1]]!=a[i+1])||(ask(id2[j+1],j+1)&&a[i+1-id2[j+1]]>=a[i+1])||(ask(id3[j+1],j+1)&&a[i+1-id3[j+1]]<=a[i+1]))) j++;//printf("i=%d p=%d\n",i+1,j);if(j==m){st[++ans]=i+1-m+1;j=p[j];}}
}
int main(){scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n;i++) scanf("%d",&a[i]);for(int i=1;i<=m;i++) scanf("%d",&b[i]);for(int i=1;i<=s;i++){zhan[i].push_back(0);//zhan[i][0]=0;}for(int i=1;i<=m;i++){zhan[b[i]].push_back(i);//zhan[b[i]][++top[b[i]]]=i;++top[b[i]];}build();for(int i=1;i<=s;i++){if(!top[i]) del(i);}for(int i=m;i>=1;i--){int x=l[b[i]],y=r[b[i]];if(x) id2[i]=i-zhan[x][top[x]];if(y<=s) id3[i]=i-zhan[y][top[y]];if(!--top[b[i]]) del(b[i]);else id1[i]=i-zhan[b[i]][top[b[i]]];//printf("i=%d id1=%d id2=%d id3=%d\n",i,id1[i],id2[i],id3[i]);}solve();kmp();printf("%d\n",ans);for(int i=1;i<=ans;i++){printf("%d\n",st[i]);}return 0;
}
/*
9 6 10
5 6 2 10 10 7 3 2 9 
1 4 4 3 2 16 4 10
3 5 2 7 1 9
3 8 2 10
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

历史上的今天(history)+ 勇者斗恶龙(dragon)

朋友们我来了&#xff0c;好久都没有更新了&#xff0c;手实在痒痒&#xff0c;不撸两道&#xff0c;内心过意不去 文章目录A&#xff1a;历史上的今天&#xff08;history&#xff09;题目题解代码实现B&#xff1a; 勇者斗恶龙&#xff08;dragon&#xff09;题目描述题解代…

领域驱动设计,让程序员心中有码(四)

#领域驱动设计&#xff0c;让程序员心中有码&#xff08;四&#xff09;----------------------追忆有关分层的古老往事我一直认为&#xff0c;程序员也是艺术家&#xff0c;他们撰写的每一行代码&#xff0c;是献给这大好世界的优美诗篇。不同的人&#xff0c;写的代码也许风格…

YBTOJ洛谷P4551:最长异或路径(trie树)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 本题关键就在于一点&#xff1a; 若把每个点的深度dep[i]定义为从根到节点边权的异或和 那么i到j的路径异或和可以表示为&#xff1a; dep[i] ^ dep[j] 首先要是i、j在不同子树上显然成立 如果他们在同一子树上&#xff0c;…

基于Asp.Net Core打造轻量级内部服务治理RPC(一)

继之前的《Asp.Net Core Docker 搭建》文章末尾说过的&#xff0c;将陆续编写基于asp.net core 打造一个内部服务治理的rpc框架。不过前端时间较忙&#xff0c;所以搁置了一段时间。闲话不多说&#xff0c;下面就来讲讲为什么需要去做一个该框架&#xff0c;以及想法的来源和设…

YBTOJ:前缀询问(trie树)

文章目录题目描述解析代码题目描述 解析 &#xff08;没有做出来&#xff0c;这个ans的处理方式其实也不难想…qwq&#xff09; 考虑把T都作为模板串加入trie树 加入每个模板串自然就是按照i顺序的 所以我们在插入t的时候沿途标记一下 新出现的未标记的i的间隔就是当前的i与上…

DP专练1( [NOIP 2003]加分二叉树 + 太空梯 )

我们先慢慢来加分二叉树题目题解简单讲解前序//中序//后序遍历代码实现太空梯题目题解代码实现加分二叉树 题目 题解 简单讲解前序//中序//后序遍历 其实说白了&#xff0c;这个*序就是根root的遍历顺序 先序就是root–>left–>right 中序就是left–>root–>rig…

YBTOJ:运动积分(trie树)

文章目录题目描述解析代码题目描述 解析 做了巨长时间… 进行了一次刺激的阅读理解竞赛… 感谢whh dalao&#xff01; 那么让我们分析一下这道题 首先我们考虑单个求x选手的q值 不难发现 i 在第j天和x的大小关系只与a[x]与a[i]二进制下不同的最高位k有关 j的第k位与x相同时&am…

年终总结,我为什么离开舒适区?

当圣诞夜过去&#xff0c;也意味着这一年即将结束&#xff0c;迎来崭新的开始&#xff0c;一年时间既短暂&#xff0c;又漫长&#xff0c;当离开人生的舒适区&#xff0c;将迎来一个又一个的挑战。如果说一个人的优秀&#xff0c;取决于他天赋&#xff0c;以及他为之付出的额外…

NC16886 炮兵阵地

题目&#xff1a; n*m个网格&#xff0c;有平原&#xff0c;有山地&#xff0c;平原可以放部队&#xff0c;部队攻击范围如图&#xff08;不受地形影响&#xff09;&#xff08;H为山地&#xff0c;P为平原&#xff09; 题解&#xff1a; 确定状态&#xff1a; 因为每个炮可…

DP专练2 (大理石 + [ZJOI 2010]数字计数)

你肯定以为DP专练会有很多题&#xff0c; 但是请考虑一下本仙女的DP码力&#xff0c;一次性能更几个题。。。 来吧&#xff0c;别害怕呀~~ 文章目录大理石题目题解代码实现数字计数题目题解代码实现大理石 题目 林老师是一位大理石收藏家&#xff0c;他在家里收藏了n块各种…

YBTOJ:斐波拉契(矩阵快速幂)

文章目录题目描述题目描述代码题目描述 题目描述 关键在于如何转化为本题的题目。。。 设 y(1-根号5&#xff09;/2$$ 再令&#xff1a; A(n)xn yn 通过尝试可以发现&#xff0c;A其实就是一个1,3为前两项的斐波拉契数列 则 xnA(n)-yn A的值可以用矩阵快速幂来求 而y是在(-1,…

ABP 框架 数据库底层迁移 Mysql 集群

技术交流&#xff0c;请加QQ群&#xff1a;538327407我的各种github 开源项目和代码&#xff1a;https://github.com/linbin524背景笔者 目前架构的IOT 项目是使用abp 框架作为后台,虽然abp的框架适用于中小型项目框架&#xff0c;但由于架构优美&#xff0c;笔者认为还是可以经…

数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)

虽然作业还没有做完&#xff0c;但是我还是放不下它&#xff0c;对此&#xff0c;我只想说&#xff1a; 今天你对作业爱理不理&#xff0c;明天它就让你补到飞起 DP先放放&#xff0c;我们要雨露均沾练习上手&#xff1a;乘法逆元题目题解代码实现曹冲养猪?&#xff08;互质的…

开发.NET Core NuGet包并实现CI/CD

实际开发中我们需要对一些公共类库进行开发&#xff0c;并基于Jenkins进行CI/CD&#xff08;CI:持续集成&#xff0c;CD:持续部署&#xff09;,其他项目通过NuGet引用。上文讲述了如何搭建本地NuGet服务器并发布NuGet包&#xff0c;这里不再赘述。CI/CD流程如下图&#xff1a;首…

acwing221 龙哥的问题

acwing221 龙哥的问题 文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;题目&#xff1a; 题解&#xff1a; 代码&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll;int phi(int x) {int ansx;for(int i2;(ll)i*i<x;i)if(x%…

DP专练3:征途

虽然只有1道题&#xff0c;但是含金量还是够够di 文章目录题目题解代码实现题目 题解 我们直接对答案输出格式进行处理&#xff1a;设第 iii 天走的路程为 aia_iai​&#xff0c;总路程为 S∑i1nleniS\sum_{i1}^nlen_iS∑i1n​leni​&#xff0c;那么 v∑i1m(ai−Sm)2mv∑_{i1…

云时代的.NET

编程语言从最初的0101机器码到汇编语言再到面向对象的编程&#xff0c;不断的发展&#xff0c;整个发展趋势呈现高内聚、低耦合、可重用、可理解的特点。最早编程是用机器码&#xff0c;人的大脑不像电脑&#xff0c;无法处理0101&#xff1b;后来汇编语言还是太费解&#xff0…

研究性学习:APP的隐私问题

文章目录写在前面背景&#xff08;problem&#xff09;一个实例(example)手机App用户输入隐私数据的识别与检测技术研究&#xff08;solution&#xff1f;&#xff09;&#xff08;官方&#xff09;概览背景介绍4.系统设计隐私政策引言1.收集信息2. 信息使用3. 信息披露4. 信息…

DP专练4:[SCOI 2010]股票交易(单调队列优化dp)

昨天晚上&#xff0c;初见它时&#xff0c;月黑风高&#xff0c;一个电脑&#xff0c;一支笔&#xff0c;一个人 今天秋高气爽&#xff0c;再一瞥&#xff0c;回眸间 我又来了&#xff0c;honey题目题解代码实现题目 题解 首先这种 iii 天与前面 jjj 天有关联&#xff0c;而…

【做题记录】[NOIP2016 普及组] 魔法阵

P2119 魔法阵 2016年普及组T4 题意&#xff1a; 给定一系列元素 \(\{X_i\}\) &#xff0c;求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 。 \[\begin{cases}X_a<X_b<X_c<X_d \\ X_a-X_b2\times (X_d-X_c) \\X_b-X_a<\dfrac{X_c-X_b}{3}\end{cases} \]…