当前位置: 首页 > news >正文

HJ177 可匹配子段计数

    知识点双指针

    校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

    描述

    给定整数数组 aa(长度 nn)与数组 bb(长度 mm,m≦nm≦n)。设一个长度为 mm 的数组 cc 被称为可匹配的,当且仅当将 cc 的元素重新排列后,与数组 bb 在对应位置上至少有 kk 个元素相等。
    对于 aa 中的每一个长度恰为 mm 的连续子段,都可视为一个候选数组 cc。求满足条件的子段数量。

    【形式化解释】
    若子段 al..l+m−1al..l+m−1​ 经重排可与 bb 至少 kk 个位置相等,则称该子段为"可匹配的"。等价地,设 cntx(S)cntx​(S) 为元素 xx 在序列 SS 中出现次数,则子段 cc 的"匹配度"为 match⁡(c)=∑xmin⁡(cntx(c), cntx(b))match(c)=∑x​min(cntx​(c), cntx​(b)),若 match⁡(c)≧kmatch(c)≧k 则符合要求。

    输入描述:

    第一行输入整数 t(1≦t≦104)t(1≦t≦104)——测试用例组数。
    每个测试用例:
    • •​一行三个整数 n,m,k(1≦k≦m≦n≦2×105)n,m,k(1≦k≦m≦n≦2×105);
    • •​一行 nn 个整数 a1…an (1≦ai≦106)a1​…an​ (1≦ai​≦106);
    • •​一行 mm 个整数 b1…bm (1≦bi≦106)b1​…bm​ (1≦bi​≦106)。
    输入保证所有测试用例的 nn 之和、mm 之和均不超过 2×1052×105。

    输出描述:

    对每个测试用例输出一行整数,表示满足条件的子段数量。

    示例1

    输入:

    1 4 1 1 4 1 5 6 6

    复制输出:

    1
    #include <iostream> #include <vector> #include <map> using namespace std; void solve() { int n, m, k; cin >> n >> m >> k; vector<int> a(n); map<int, int> mapB; for (int i = 0; i < n; ++i) { cin >> a[i]; } for (int i = 0; i < m; ++i) { int val; cin >> val; mapB[val]++; } map<int, int> mapA; int current_match = 0; int ans = 0; // 初始化第一个窗口 for (int i = 0; i < m; ++i) { mapA[a[i]]++; } for (auto const& [val, countB] : mapB) { if (mapA.count(val)) { current_match += min(mapA[val], countB); } } if (current_match >= k) { ans++; } // 滑动窗口 for (int i = m; i < n; ++i) { int remove_val = a[i - m]; int add_val = a[i]; // 处理移出窗口的元素 if (mapB.count(remove_val)) { if (mapA[remove_val] <= mapB[remove_val]) { current_match--; } } mapA[remove_val]--; if (mapA[remove_val] == 0) { mapA.erase(remove_val); } // 处理加入窗口的元素 if (mapB.count(add_val)) { if (mapA.count(add_val) < 1 || mapA[add_val] < mapB[add_val]) { current_match++; } } mapA[add_val]++; if (current_match >= k) { ans++; } } cout << ans << endl; } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
    http://www.jsqmd.com/news/642003/

    相关文章:

  • 从零开始:NVIDIA显卡驱动与CUDA环境搭建全攻略(附常见问题解决)
  • 终极抢票指南:3分钟学会用biliTickerBuy轻松抢到B站会员购限量商品
  • 深度学习正则化 —— 控制容量的实战武器库(十七)
  • 2026年至今河北白酒市场激变:销售公司如何破局选对“硬核”供应商? - 2026年企业推荐榜
  • 郭老师-抓住风口,重构自我
  • 昆仑通态触摸屏进阶开发技巧~2025.5.20
  • 如何利用ViGEmBus虚拟手柄驱动实现Windows游戏控制器完美兼容
  • 知识图谱-Neo4j实战指南:从安装到应用开发
  • 今天不看就淘汰:2026奇点大会定义的图像描述生成新标准——多轮指代理解、跨模态因果推理、可控细粒度生成,你达标了吗?
  • Fiji图像处理平台:从零开始掌握科研级图像分析
  • 如何用ncmdumpGUI将网易云音乐NCM文件转换为通用音频格式
  • STM32 RTC实战:从零构建高精度实时时钟系统
  • 郭老师-百年大变局中的学习力觉醒
  • 蓝奏云直链解析终极指南:3秒获取高速下载链接
  • 为什么92%的多模态API响应超时源于服务编排层?:揭秘LLM+VLM+ASR联合服务链路的4类隐性瓶颈与低代码修复方案
  • Noto字体:终结全球文字显示乱码的革命性解决方案
  • 软件测试工程师不被AI取代的防御技能:在AI浪潮中构筑专业护城河
  • Fast-GitHub:终极免费的GitHub加速浏览器扩展完整指南
  • EndNote文献排版优化:对齐方式、缩进与页码显示的完整解决方案
  • Latex公式速成:Word与PPT中的高效输入技巧
  • LRCGet:离线音乐库的智能歌词同步解决方案
  • 大模型时代的人脸识别还安全吗?2026奇点大会首次披露对抗攻击防御框架,仅限首批参会者获取白皮书
  • 2026ACM训练日记
  • 2026年当下,企业如何精明选择AI关键词优化服务商及费用把控? - 2026年企业推荐榜
  • 终极AMD Ryzen处理器调校指南:SMUDebugTool完整解锁隐藏性能
  • 洞察2026现阶段:上海复合调料直销厂商竞争力全景评估 - 2026年企业推荐榜
  • 快速搭建Image-to-Video图像转视频生成器:小白也能轻松搞定
  • 全球远程工作机会:开发者地理套利策略
  • 2026年沧州人造草坪市场洞察与核心服务商推荐 - 2026年企业推荐榜
  • ncmdumpGUI终极指南:3步快速解密网易云音乐NCM文件