<kmp>codevs 1404 字符串匹配
来源:互联网 发布:摔跤知乎 编辑:程序博客网 时间:2024/05/17 14:17
题面传送门
以为是kmp的裸题(其实差不多233),结果调了半天,后来搜了题解才知道要怎么改。
在kmp算法的过程中,如果在每循环到i时,记ans[p]++。这个数组代表的意义是:到字符串A的第i个字符的最大匹配长度。但是,对于ans[nxt[p]],我们却没有作记录。所以在最后处理ans函数时,先倒序处理一遍(一定要倒序),这样才能累加。这样子处理出来的ans数组代表大于等于它的所有答案,最后的答案就是ans[x]-ans[x+1],所以再处理一遍ans数组就可以了。
注意:倒序循环时,不能循环到0,否则就会重复累加
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=200000+10;char A[maxn],B[maxn];int n,m,k,x;int ans[maxn],nxt[maxn];void make_nxt(){ for(int i=1;i<m;++i) { int p=nxt[i]; while(p&&B[i+1]!=B[p+1]) p=nxt[p]; if(B[i+1]==B[p+1]) p++; nxt[i+1]=p; }}void kmp(){ int p=0; for(int i=1;i<=n;++i) { while(p&&B[p+1]!=A[i]) p=nxt[p]; if(A[i]==B[p+1]) ++p; ans[p]++; }}int main(){ scanf("%d%d%d",&n,&m,&k); scanf("%s\n%s",A+1,B+1); make_nxt(); kmp(); for(int i=m;i>0;--i) ans[nxt[i]]+=ans[i]; for(int i=0;i<=m;++i) ans[i]-=ans[i+1]; for(int i=1;i<=k;++i) { scanf("%d",&x); printf("%d\n",ans[x]); } return 0;}
阅读全文
0 0
- Codevs 1404 字符串匹配(Kmp)
- 【codevs】 1404 字符串匹配(KMP)
- <kmp>codevs 1404 字符串匹配
- KMP 字符串匹配算法
- kmp字符串匹配算法
- kmp字符串匹配算法
- KMP字符串匹配算法
- 字符串匹配算法-kmp
- KMP(字符串匹配)算法
- 字符串匹配 KMP
- KMP 字符串匹配算法
- 字符串匹配算法:KMP
- KMP算法 字符串匹配
- 字符串匹配 KMP 算法
- KMP字符串匹配(1)
- KMP字符串匹配(2)
- KMP字符串匹配(3)
- KMP字符串匹配算法
- [分享]利用QuadSPI外扩串行NOR Flash的实现
- Spring学习笔记
- 设计模式 适配器模式
- 数组元素是json对象的去重方法
- spring boot项目实战之公共代码抽取
- <kmp>codevs 1404 字符串匹配
- web服务之httpd基础配置与源码安装apache
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity(Hash)
- 在查找之前执行一遍这个
- 初学Python第四天
- 日志学习
- (转)RecyclerView 中setSpanSizeLookup 解释
- python3爬虫初探(七)使用MySQL
- JS基础知识笔记