时间限制: 1 s

空间限制: 128000 KB
题目等级 : 大师 Master
 
 
 
 
题目描述 Description

给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度。
给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个。
N,M,K<=200000

输入描述
Input Description

第一行三个数 N,M,K,表示A的长度、B的长度和询问数。
第二行为串A。
第三行为串B。
接下来K行,每行1个数X。

输出描述
Output Description

对于每个询问输出一个数。

样例输入
Sample Input

6 2 2
aabcde
ab
0
2

样例输出
Sample Output

4
1

数据范围及提示
Data Size & Hint

各个测试点1s

思路

KMP;

自己乱搞才得了10分,然后羞耻的看了题解;

先求B串next数组;

然后匹配,记录ans;

然后,这个ans是残缺的,需要倒序补充,ans[next[i]]+=ans[i];

这样得到的ans[i]就会是匹配长度大于等于i的位数;

然后,解决询问。

代码实现

 #include<cstdio>
const int maxn=3e5;
int n,m,k,a;
char ch[maxn],cn[maxn];
int next[maxn],ans[maxn];
int main(){
scanf("%d%d%d",&n,&m,&k);
scanf("%s%s",ch+,cn+);
for(int i=,j=;i<=m;i++){
while(j&&cn[j+]!=cn[i]) j=next[j];
if(cn[j+]==cn[i]) ++j;
next[i]=j;
}
for(int i=,j=;i<=n;i++){
while(j&&cn[j+]!=ch[i]) j=next[j];
if(cn[j+]==ch[i]) ++j;
ans[j]++;
}
for(int i=m;i>;i--) ans[next[i]]+=ans[i];
for(int i=;i<m;i++) ans[i]-=ans[i+];
while(k--){
scanf("%d",&a);
printf("%d\n",ans[a]);
}
return ;
}

KMP的题都好玄学,还是我变傻了。。。

最新文章

  1. C# 委托Delegate(一) 基础介绍&amp;用法
  2. MVC+Jsonp实现跨域交互
  3. 观看github前100开源项目的读后感
  4. vs2012 MSDN帮助文档离线包下载安装方法
  5. JVM中的Stack和Heap
  6. mysql5.6.16绿色版配置、运行
  7. xdu_1009: Josephus环的复仇(线段树)
  8. Widows自带系统监控工具——24小时监控服务器性能
  9. 爬取页面InsecureRequestWarning: 警告解决笔记
  10. TsinsenA1221 大楼【矩阵快速幂】
  11. base64位代码转图片文件并保存到文件夹的解决方案
  12. main主函数
  13. P2221 [HAOI2012]高速公路
  14. 《vim实用技巧》读书笔记
  15. 图片上传并回显Ajax异步篇
  16. day 56 jQuery学习
  17. 第五次作业 hql查询
  18. Hibernate(五)
  19. atitit. &#160;web组件化原理与设计
  20. FTP协议完全详解

热门文章

  1. 字符类型C++(ascll码表)
  2. ACM_蛇形矩阵
  3. hihocoder1365 图片排版
  4. Python之绘图和可视化
  5. 安卓开发常用网络请求框架OkHttp、Volley、XUtils、Retrofit对比
  6. RabbitMQ 为什么需要信道?为什么不是TCP直接通信?
  7. dede其他栏目页的logo没有完整显示怎么办?
  8. mongodb GUI工具
  9. WinRT ListView间隔变色(二)
  10. Queries for Number of Palindromes(求任意子列的回文数)