codeforces MUH and Cube Walls
题意:给定两个序列a ,b, 如果在a中存在一段连续的序列使得
a[i]-b[0]==k, a[i+1]-b[1]==k.... a[i+n-1]-b[n-1]==k
就说b串在a串中出现过!最后输出b串在a串中出现几次!
思路: KMP变形!如何转换成KMP求解呢?
举一个例子说明一下:
a: 5 10 8 10 11 9 11 12 10 15
b: 4 2 4 5 3
根据题意 a中的 10 8 10 11 9 与 b是匹配的, 11 9 11 12 10跟b也是匹配的!
如何将b串以及 10 8 10 11 9, 以及 11 9 11 12 10转换成同一个串?这样好套用kmp啊!
因为对应的数值的差值都是相同的! 令a[i]-=a[i+1], b[i]-=b[i+1]!
这样也就是将串的长度减少了1,这样就可以套kmp模板了!
别忘记对特殊情况考虑一下!
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstring> 6 #define N 200005 7 using namespace std; 8 9 int f[N], a[N], b[N]; 10 int n, w; 11 void getFail(){ 12 f[0]=0; f[1]=0; 13 for(int i=1; i<w; ++i){ 14 int j=f[i]; 15 while(j && b[i] != b[j]) j=f[j]; 16 if(b[i] == b[j]) f[i+1] = j+1; 17 else f[i+1] = 0; 18 } 19 } 20 21 void findText(){ 22 int j=0; 23 int cnt = 0; 24 for(int i=0; i<n; ++i){ 25 while(j && a[i] != b[j]) j=f[j]; 26 if(a[i] == b[j]) ++j; 27 if( j == w ) ++cnt; 28 } 29 printf("%d\n", cnt); 30 } 31 32 int main(){ 33 scanf("%d%d", &n, &w); 34 for(int i=0; i<n; ++i){ 35 scanf("%d", &a[i]); 36 if(i) a[i-1] -= a[i]; 37 } 38 39 for(int i=0; i<w; ++i){ 40 scanf("%d", &b[i]); 41 if(i) b[i-1] -= b[i]; 42 } 43 if(n==1 && w==1){ 44 printf("%d\n", 1); 45 return 0; 46 } 47 else if(n==1){ 48 printf("%d\n", 0); 49 return 0; 50 } 51 else if( w==1 ){ 52 printf("%d\n", n); 53 return 0; 54 } 55 --n; 56 --w; 57 b[w] = -1e6; 58 getFail(); 59 findText(); 60 return 0; 61 }
View Code
codeforces MUH and Cube Walls相关推荐
- codeforces D MUH and Cube Walls(kmp)
先分别计算a,b数组的差分,得到两个数组,文本数组和模式数组,然后使用kmp统计模式数组在文本数组出现个数.对于b数组长度为1时,结果就是数组a的长度. 代码参考: OJ/codeforces/471 ...
- Codeforces 471 D MUH and Cube Walls
题目大意 Description 给你一个字符集合,你从其中找出一些字符串出来. 希望你找出来的这些字符串的最长公共前缀*字符串的总个数最大化. Input 第一行给出数字N.N在[2,1000000 ...
- codeforces MUH and Important Things
/* 题意:给一个序列,表示每一项任务的难度,要求完成每一项任务的循序是按照难度由小到大的!输出三种符合要求的工作顺序的序列! 思路:直接看代码.... */ 1 #include<iostre ...
- linux mint 下载迅雷安装包,Linux Mint如何安装“微信、QQ、迅雷、WPS办公软件”等国内上瘾软件...
Ubuntu14-04 MySQL-5.6.21通用二进制安装 #卸载mysql /etc/init.d/mysqld stop &> /dev/null killall mysqld ...
- Prefix function. Knuth–Morris–Pratt algorithm
Prefix function. Knuth–Morris–Pratt algorithm Prefix function definition You are given a string \(s\ ...
- 前缀函数及kmp算法
1.字符串基础 1.1 字符集 一个字符集是一个建立了全序关系的集合,也就是说中的任意两个不两只的元素和都可以比较大小,要么,要么.字符集中的元素称为字符. 1.2 字符串 一个字符串S是将n个字符顺 ...
- 算法笔记--KMP算法 EXKMP算法
1.KMP算法 这个博客写的不错:http://www.cnblogs.com/SYCstudio/p/7194315.html 模板: next数组的求解,那个循环本质就是如果相同前后缀不能加上该位 ...
- BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
题目传送门 1 /* 2 题意:问最少替换'*'为'.',使得'.'连通的都是矩形 3 BFS:搜索想法很奇妙,先把'.'的入队,然后对于每个'.'八个方向寻找 4 在2*2的方格里,若只有一个是'* ...
- Codeforces Round #297 (Div. 2)D. Arthur and Walls 搜索bfs
题目链接: http://codeforces.com/contest/525/problem/D 题意 给你一个n*m的田地,有一些*的地方是可以移除变成"."的,然后问你移除最 ...
最新文章
- Tiny4412 Uboot
- mysql 触发器死循环_请教如何避免该条触发器的死循环
- 【UGV】Mec 麦轮版小车结合角度传感器实现直线行走示例
- mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破?
- C语言高级编程:预处理中的 # 和 ##
- poj 2976 Dropping tests 01分数规划
- android webview 像素,Android:在WebView中加载的图像中的像素质量降低
- zepto源码--filtered, contains,funcArg,setAttribute,className,deserializeVale--学习笔记
- c语言编程中的幂函数如何编写,c语言幂函数_C语言循环与递归实现整数幂函数...
- 好消息!电商工具箱API详情接口,更全面
- H3C-云计算技术专题培训(分享六)
- matlab上位机电机,基于MATLAB的电机综合性能测试系统上位机软件设计
- Axure 教程 |中级电子商务网站设计
- 智能聊天机器人微信小程序
- 机械中计算机的应用研究,机械设计制造及其自动化中计算机技术的应用研究
- linux内核教学的全套视频,中科大老师全程讲解Linux内核分析视频教程《附加介绍+总结》共23节课...
- form表单提交编码介绍
- 视频去水印的方法-视频怎么去水印视频教程
- 面向垂直行业的5G核心网关键技术演进分析
- JAVA开发运维(DevOps过程)