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


题意:给两个字符串 \(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;
}

最新文章

  1. vue 中判断页面滑动方向
  2. LVM &#39;Can’t open /dev/sdb1 exclusively. Mounted filesystem?&#39; Problem
  3. 连接到kali linux服务器上的MySQL服务器错误
  4. Python 学习笔记四
  5. jQuery单选框radio绑定click事件
  6. ch2-3:模块的使用-window环境
  7. noip2016酱油记day1
  8. UVA10361 -自动作诗机
  9. iptables 代理设置
  10. delphi xe5 android sample 中的 SimpleList 是怎样绑定的
  11. numpy初识
  12. 使用MSHTML解析HTML页面
  13. Access Logging Tomcat
  14. Oracle篇 之 多表查询
  15. 利用OpenStreetMap(OSM)数据搭建一个地图服务
  16. linux内存源码分析 - 内存回收(匿名页反向映射)
  17. Innodb日志与事务
  18. Task任务的屏障机制
  19. Docker CE的安装 与镜像加速
  20. Spring4总结

热门文章

  1. 操作系统-Linux命令
  2. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
  3. 性能工具之Jmeter小白入门系列之一
  4. 「模拟8.13」任(liu_runda的神题,性质分析)
  5. 【题解】覆盖问题 BZOJ1052 HAOI2007 二分
  6. bzoj2427 软件安装! 树dp
  7. Oracle对大表进行delete注意事项
  8. Java程序安装失败
  9. DOS命令行(2)——Windows磁盘维护与管理
  10. Jenkins 进阶篇 - 节点配置