Codeforces Round 938 (Div. 3)------>D. Inaccurate Subsequence Search

2024-04-09 16:52

本文主要是介绍Codeforces Round 938 (Div. 3)------>D. Inaccurate Subsequence Search,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,思路:

1.这是一道很明显的双指针问题(类滑窗问题),我们只需要用一个双指针在a数组中维护一个长度为m区间,同时维护当中与b数组中匹配的数量 cnt,那么怎么维护呢?

2.一个一个遍历肯定不行的,我们可以发现一个性质,就是随着区间移动,他只有首位的数子发生变化,所以我们只需要判断首位的数字匹配情况,来更新cnt,这样就能实现O(n)的时间复杂度来解决。

二,代码:

#include <iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<vector>
using namespace std;const int N=2e5+10,M=1e9+7;typedef  long long ll;
typedef pair<int,int> pii;int arr[N],brr[N];void Solved() {int n,m,k;cin>>n>>m>>k;for(int i=1;i<=n;i++){cin>>arr[i];}//记录b数组中数字情况(注意有重复的情况)map<int,int> mp;for(int i=1;i<=m;i++){cin>>brr[i];mp[brr[i]]++;}//维护长度为m的区间的数字情况map<int,int> temp;int res=0;int cnt=0;for(int r=1,l=1;r<=n;r++){//右端点的移动可以使区间内的数字数量增加   temp[arr[r]]++;//对于这个判断的原因我举个例子你就明白了
//当区间中已经有两个一样的数字2与b数组匹配,那么此时再增加一个数字2,也不会改变匹配数量
//反之如果 temp[arr[r]]<=mp[arr[r]]说明“坑位”还有,可以贡献匹配数if(temp[arr[r]]<=mp[arr[r]]) cnt++;//左端点的移动会使区间内数字减小
//和右端点移动一样的道理,加入区间内有3个2,但是b数组中只有2两个2,此时你2减少一个也不会影响匹配数if(r>m) {temp[arr[l]]--;if(temp[arr[l]]<mp[arr[l]]) cnt--;l++;}//起始区间也要算进去(r==m)的时候if(r>=m&&cnt>=k) res++;}cout<<res<<endl;
}int main()
{int t;cin>>t;while(t--) {Solved();}return 0;
}

这篇关于Codeforces Round 938 (Div. 3)------>D. Inaccurate Subsequence Search的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888708

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

JavaScript正则表达式六大利器:`test`、`exec`、`match`、`matchAll`、`search`与`replace`详解及对比

在JavaScript中,正则表达式(Regular Expression)是一种用于文本搜索、替换、匹配和验证的强大工具。本文将深入解析与正则表达式相关的几个主要执行方法:test、exec、match、matchAll、search和replace,并对它们进行对比,帮助开发者更好地理解这些方法的使用场景和差异。 正则表达式基础 在深入解析方法之前,先简要回顾一下正则表达式的基础知识。正则

插件maven-search:Maven导入依赖时,使用插件maven-search拷贝需要的依赖的GAV

然后粘贴: <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.26</version> </dependency>