HDU 5918
来源:互联网 发布:江铠同翟天临分手知乎 编辑:程序博客网 时间:2024/04/26 15:31
(好久没写博客了,我要懒死了。。。
kmp计数。
用b去匹配a,b数组的最后一个数用一个独一无二的数表示就相当于第m+1个数匹配失败,然后就会继续匹配了,wa就wa在匹配完一个之后继续匹配上,这里要特别注意!
代码:
#include <cstdio>#include <iostream>#include <cstring>using namespace std;int n, m, p;int a[1000005];int b[1000005];int f[1000005];int ans;void make_next(){ memset(f, 0, sizeof(f)); for(int i = 1, k = 0; i < m; ++i) { while(k > 0 && b[i] != b[k]) k = f[k - 1]; if(b[i] == b[k]) ++k; f[i] = k; }}void kmp(int st){ for(int i = st, k = 0; i < n; i += p) { while(k > 0 && a[i] != b[k]) k = f[k - 1]; if(a[i] == b[k]) ++k; if(i + (m - k) * p >= n) break; if(k == m) { ++ans; } }}int main(){ int T; int kase = 0; scanf("%d", &T); while(T--) { ans = 0; scanf("%d%d%d", &n, &m, &p); for(int i = 0; i < n; ++i) { scanf("%d", &a[i]); } for(int i = 0; i < m; ++i) { scanf("%d", &b[i]); } b[m] = 0; make_next(); for(int i = 0; i < p; ++i) { if(i + (m - 1) * p >= n) break; kmp(i); } printf("Case #%d: %d\n", ++kase, ans); }}
0 0
- HDU 5918
- hdu 5918 KMP
- HDU 5918 Sequence I
- HDU 5918 kmp
- hdu 5918(KMP)
- hdu 5918 暴力kmp
- HDU 5918 KMP变形
- HDU 5918 KMP
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- 解决问题模板
- 分享一个好用的android新手引导
- 设计模式之原型模式
- 根据店铺号取利润中心和成本中心 050-080
- 单片机的模块化编程
- HDU 5918
- 运营商最新号码段 以及 手机号码的正则表达式判断
- 第一篇
- 小娜老师的讲义-Docker基础知识-网络基础配置
- 【每天进步一点点】jquery 自动补全autocomplete
- MyEclipse中使用Maven创建web项目
- MFC通过URL下载并保存文件代码
- android中?attr/**与@drawable/**或@color/**等的区别
- JsonView beta1