CH1809 匹配统计 题解
看了好久才懂,我好菜啊……
题意:给两个字符串 \(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]
。
本题真心很难理解(好像字符串题就没有好理解的),一定要多画图,把抽象描述形象化。
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2e5+5;
int n,m,q,nxt[N],f[N],cnt[N];
char a[N],b[N];
int main()
{
scanf("%d%d%d",&n,&m,&q);
scanf("%s %s",a+1,b+1);
for(int i=2,j=0;i<=m;++i)
{
while(j>0&&b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) ++j;
nxt[i]=j;
}
for(int i=1,j=0;i<=n;++i)
{
while(j>0&&a[i]!=b[j+1]) j=nxt[j];
if(a[i]==b[j+1]) ++j;
f[i]=j;
}
for(int i=1;i<=n;++i) ++cnt[f[i]];
for(int i=m;i;--i) cnt[nxt[i]]+=cnt[i];
while(q--)
{
int x; scanf("%d",&x);
printf("%d\n",cnt[x]-cnt[x+1]);
}
return 0;
}
CH1809 匹配统计 题解的更多相关文章
- CH1809匹配统计【KMP】
1809 匹配统计 0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B” ...
- CH1809 匹配统计
题意 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了"字符串A从任意位置开始的后缀子串"与"字符串B"匹配 ...
- 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码
洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...
- 【CH1809】匹配统计(KMP)
题目链接 摘自https://www.cnblogs.com/wyboooo/p/9829517.html 用KMP先求出以a[i]为结尾的前缀与b匹配的最长长度. 比如 f[i] = j,就表示a[ ...
- 洛谷P2756飞行员配对方案问题 P2055假期的宿舍【二分图匹配】题解+代码
洛谷 P2756飞行员配对方案问题 P2055假期的宿舍[二分图匹配] 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架 ...
- C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - P ...
- POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解
题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...
- 洛谷P1554 梦中的统计 题解
题目传送门 这道题暴力又让我过了...数据真的很水(luogu) 暴力枚举n~m的每个数,再统计一次,交付评测...AC #include<bits/stdc++.h> using nam ...
- BZOJ3992:[SDOI2015]序列统计——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3992 https://www.luogu.org/problemnew/show/P3321 小C ...
随机推荐
- LeetCode 每日一题「判定字符是否唯一」
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 题目 ...
- P1828 [USACO3.2]香甜的黄油 Sweet Butter
题目描述 农夫$John$发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道$N(1\leqslant N\leqslant 500)$只奶牛会过来舔它,这样就能做出能卖好价钱的超甜 ...
- 【NX二次开发】Block UI 选择对象
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- Java 到底是值传递还是引用传递?
关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的.还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么. 在开始深入讲解之前,有必要 ...
- NOIP模拟测试10「大佬·辣鸡·模板」
大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...
- 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...
- 滑动窗口经典题 leetcode 3. 无重复字符的最长子串
题目 解题思路 题目要求找出给定字符串中不含有重复字符的最长子串的长度.这是一个典型的滑动窗口的题目,可以通过滑动窗口去解答. 滑动窗口 具体操作如下图示:找到一个子串 s[left...right] ...
- ELK Stack企业日志平台文档
ELK Stack企业日志平台文档 实验环境 主机名 IP地址 配置 系统版本 用途 controlno ...
- 46、django工程(view)
46.1.django view 视图函数说明: 1.http请求中产生两个核心对象: (1)http请求:HttpRequest对象. (2)http响应:HttpResponse对象. 2.vie ...
- hdu 3117 Fibonacci Numbers 矩阵快速幂+公式
斐波那契数列后四位可以用快速幂取模(模10000)算出.前四位要用公式推 HDU 3117 Fibonacci Numbers(矩阵快速幂+公式) f(n)=(((1+√5)/2)^n+((1-√5) ...