看了好久才懂,我好菜啊……


题意:给两个字符串 \(a\) 与 \(b\),对于 \(q\) 次询问,每次询问给出一个 \(x\),求存在多少个位置使得 \(a\) 从该位置开始的后缀子串与 \(b\) 匹配的长度恰好为 \(x\)。

这题可以 Hash+二分 \(O(n\log n)\) 过,还有一个高端做法是扩展 KMP(然而并不会

正解的话,还是 KMP。但此题对 KMP 的理解还是要求很高啊。

对 \(b\) 求一遍 \(nxt\),再求 \(a\) 的 \(f\)。那么根据定义,\(f_i=j\) 表示 \(a_{i-j+1\sim i}=b_{1\sim j}\),换句话说,\(a\) 从 \(i-j+1\) 开始的后缀与 \(b\) 的匹配长度至少为 \(j\)。

由于我们只是求出了至少,但题目问的是精确值,那么做一个转换,开一个桶 \(cnt\),\(cnt_i\) 表示匹配长度至少为 \(i\) 的位置有几个,那么对于每一个询问,答案就是 \(cnt_x-cnt_{x+1}\)。

求完 \(f\) 后,我们把它扔进桶里。

还没完,考虑一下到现在为止 \(cnt\) 里存了什么,我们发现现在的 \(cnt_i\) 存的位置个数并没有覆盖所有的情况,也就是说我们要做一个后缀和来覆盖这些情况。

如何做后缀和?根据 KMP 的性质,如果 \(a[i-j+1\sim i]=b[1\sim j]\),那么 \(a[i-j+1\sim i-j+nxt[j]]=b[1\sim nxt[j]]\) 同样成立,并且中间的都不成立,也就是说,\(nxt[j]\) 是次选项。进一步地,\(nxt[nxt[j]],nxt[nxt[nxt[j]]],...\)都是满足条件的选项,这样我们的答案就得到了扩展并覆盖了所有情况。

所以我们倒序枚举 \(m\),后缀和的递推式就是cnt[nxt[i]]+=cnt[i]

本题真心很难理解(好像字符串题就没有好理解的),一定要多画图,把抽象描述形象化。

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. const int N=2e5+5;
  5. int n,m,q,nxt[N],f[N],cnt[N];
  6. char a[N],b[N];
  7. int main()
  8. {
  9. scanf("%d%d%d",&n,&m,&q);
  10. scanf("%s %s",a+1,b+1);
  11. for(int i=2,j=0;i<=m;++i)
  12. {
  13. while(j>0&&b[i]!=b[j+1]) j=nxt[j];
  14. if(b[i]==b[j+1]) ++j;
  15. nxt[i]=j;
  16. }
  17. for(int i=1,j=0;i<=n;++i)
  18. {
  19. while(j>0&&a[i]!=b[j+1]) j=nxt[j];
  20. if(a[i]==b[j+1]) ++j;
  21. f[i]=j;
  22. }
  23. for(int i=1;i<=n;++i) ++cnt[f[i]];
  24. for(int i=m;i;--i) cnt[nxt[i]]+=cnt[i];
  25. while(q--)
  26. {
  27. int x; scanf("%d",&x);
  28. printf("%d\n",cnt[x]-cnt[x+1]);
  29. }
  30. return 0;
  31. }

CH1809 匹配统计 题解的更多相关文章

  1. CH1809匹配统计【KMP】

    1809 匹配统计 0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B” ...

  2. CH1809 匹配统计

    题意 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了"字符串A从任意位置开始的后缀子串"与"字符串B"匹配 ...

  3. 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码

    洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...

  4. 【CH1809】匹配统计(KMP)

    题目链接 摘自https://www.cnblogs.com/wyboooo/p/9829517.html 用KMP先求出以a[i]为结尾的前缀与b匹配的最长长度. 比如 f[i] = j,就表示a[ ...

  5. 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码

    洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...

  6. C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - P ...

  7. POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解

    题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...

  8. 洛谷P1554 梦中的统计 题解

    题目传送门 这道题暴力又让我过了...数据真的很水(luogu) 暴力枚举n~m的每个数,再统计一次,交付评测...AC #include<bits/stdc++.h> using nam ...

  9. BZOJ3992:[SDOI2015]序列统计——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3992 https://www.luogu.org/problemnew/show/P3321 小C ...

随机推荐

  1. 深入理解java虚拟机笔记Chapter2

    java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...

  2. Dynamic Anchor Learning for Arbitrary-Oriented Object Detection(DAL)

    面向任意目标检测的动态锚点学习 摘要:面向任意的目标广泛地出现在自然场景.航空照片.遥感图像等中,因此面向任意的目标检测得到了广泛的关注.目前许多旋转探测器使用大量不同方向的锚点来实现与地面真实框的空 ...

  3. spring boot 并发请求,其他系统接口,丢失request的header信息【多线程、线程池、@Async 】

    场景:一次迭代在灰度环境发版时,测试反馈说我开发的那个功能,查询接口有部分字段数据是空的,后续排查日志,发现日志如下: feign.RetryableException: cannot retry d ...

  4. Ajax(内含json)认识

    Ajax 认识 一.概念 1.Ajax 即"Asynchronous Javascript And XML"(英[eɪˈsɪŋkrənəs]异步 JavaScript 和 XML) ...

  5. Windows的静态库与动态库

    Windows的静态库与动态库 1.静态库 1.1 静态库特点 运行不存在 静态库源码被链接到调用程序中 目标程序的归档 1.2 C语言静态库 C静态库的创建 创建一个静态库项目. 添加库程序,源文件 ...

  6. 合宙模块LUA相关资料汇总

    1. 目录 1. 目录 [2. LUA二次开发](#2. LUA二次开发) 2.1 [新手教程](#2.1 新手教程) 2.2 [进阶教程](#2.2 进阶教程) 2.3 [LUA开发环境](#2.3 ...

  7. 【题解】覆盖问题 BZOJ1052 HAOI2007 二分

    题目描述 某 人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用 3个LL的正方形塑料薄膜将小树遮起来.我 ...

  8. 关于MySql数据库误操作数据找回的办法

    先讲个事,前段时间,系统长时间不用的一个功能被开放出来了,想当然的我没有在测试平台上测试,直接操作了正式系统(的确是我不严谨),导致好多数据异常,页面展示错乱了.于是我想到的第一个就是进行备份还原.项 ...

  9. 教你用python搭建一个「生活常识解答」机器人

    今天教大家如何用Python爬虫去搭建一个「生活常识解答」机器人. 思路:这个机器人主要是依托于"阿里达摩院发布的语言模型PLUG",通过爬虫的方式,发送post请求(提问),然后 ...

  10. 高速数字逻辑电平(8)之LVDS差分信号深度详解

    原文地址点击这里: LVDS(Low-Voltage Differential Signaling ,低电压差分信号)是美国国家半导体(National Semiconductor, NS,现TI)于 ...