hdu4749 kmp改进
这题说的是给了一个模板串 然后又给了一个串 需要找出类似的按个模板串 , 改相等的位置要相等 该大于的位置到大于
我们将模板串做好失配指针就ok了,然后匹配和原来的匹配不同,这个匹配需要的是相对匹配,只要他们的相对位置相同就ok了,每次计算要插入的数在这个匹配中的排位
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn=;
int x[maxn],a[maxn],D[];
int F[maxn];
void getFail(int m)
{
F[]=; F[]=;
for(int i=; i<=m; i++)
{
int j=F[i];
while( j != && a[i] != a[j]) j = F[ j ];
F[i+]=( a[i] == a[j] )? j+ : ;
}
}
int perx[maxn][],pera[maxn][];
void init(int n, int m,int k)
{
memset(perx[],,sizeof(perx[]));
memset(pera[],,sizeof(pera[]));
for(int i=; i<=n; i++)
{
for(int j=; j<=k; j++)
perx[i][j]=perx[i-][j];
perx[i][ x[i] ]++;
}
for(int i=; i<=m; i++)
{
for(int j=; j<=k; j++)
pera[i][j]=pera[i-][j];
pera[i][a[i]]++;
}
}
bool vis[maxn];
bool jul(int xi, int aj)
{
int mii=,ei=,mij=,ej=;
for(int k=; k<x[xi]; k++)
mii+=perx[xi][k]-perx[xi-aj][k];
ei=perx[xi][ x[xi] ] - perx[ xi - aj ][ x[ xi ] ];
for(int k=; k<a[ aj ]; k++)
mij+=pera[ aj ][ k ];
ej=pera[ aj ][ a[aj] ];
return mii==mij&&ej==ei;
}
void find(int n,int m)
{
int j=;
for(int i=; i<=n; i++)
{
while(j!=&&jul(i,j)==false)j=F[j];
if(jul(i,j))j++;
if( j == m + )
{
vis[ i ]=true;j=F[j];
}
}
}
int main()
{
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)==)
{
memset(D,,sizeof(D));
for(int i=; i<=n; i++)
{
scanf("%d",&x[i]);
vis[i]=false;
}
for(int i=; i<=m; i++)
{
scanf("%d",&a[i]);
D[a[i]]=;
}
for(int i=; i<=k; i++)
D[i]=D[i]+D[i-];
for(int i=; i<=m; i++)
a[i]=D[a[i]];
getFail(m);
init(n,m,k);
find(n,m);
int ans=,loc=m;
while(loc<=n){
if(vis[loc]){
ans++;
loc+=m;
}else loc++;
}
printf("%d\n",ans);
}
return ;
}
hdu4749 kmp改进的更多相关文章
- hdu4749 kmp应用
呃,从网上看的题解,然而其实有点地方还没搞懂,先放在这,以后再回来理解. 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目:2013 is ...
- 字符串匹配(BF算法和KMP算法及改进KMP算法)
#include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...
- c语言KMP匹配算法与字符串替换算法
一.字符串匹配算法 (1)传统匹配算法BF int Index_BF(char* S, char* T){ int i=1,j=1; while(i<=strlen(S) && ...
- kpm字符串匹配算法
首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...
- 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...
- KMP及其改进算法
本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
- 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
--喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...
- KMP算法的改进
KMP算法的改进 KMP算法已经在极大程度上提高了子符串的匹配效率,但是仍然有改进的余地. 1. 引入的情景 下面我们就其中的一种情况进行分析: 主串T为"aaaabcde-" 子 ...
随机推荐
- day-2 jmeter 操作mysql数据库
1) 导入jdbc的jar包,因为jmeter本身不能直接连接mysql,所以需要导入第三方的jar包,来连接mysql 2) 创建数据库连接配置,mysql的url.端口号.账号.密码 ...
- 《HTTP - 状态码》
推荐一首歌 - 那吾克热<儿子娃娃> 非常喜欢前奏 1:状态码的作用? - 职责是当客户端发起请求时候,描述请求返回结果.根据状态码,客户端可以知道服务端是正确处理了请求,还是返回了错误. ...
- ReactDom.render调用后没有渲染
可能发生问题的代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- MovieLens电影数据分析
下载数据包 链接:https://grouplens.org/datasets/movielens/1m/ 解压: 四个文件分别是数据介绍,电影数据表,电影评分表,用户表 进行电影数据分析 进入ipy ...
- linux crypt()函数使用总结
原型: char *crypt(const char *key, const char *salt); 标准说明: crypt()算法会接受一个最长可达8字符的密钥(即key),并施以数据加密算法(D ...
- AT2134 Zigzag MST 最小生成树
正解:最小生成树 解题报告: 先放下传送门QAQ 然后这题,首先可以发现这神奇的连边方式真是令人头大,,,显然要考虑转化掉QAQ 大概看一下可以发现点对的规律是,左边++,交换位置,再仔细想下,就每个 ...
- 显示隐藏火车头快捷键Ctrl+t
今天ytkah在使用火车头的时候也使用了Photoshop,用了组合键Ctrl+t来进行调整图层的大小,可能多按了几次的缘故吧,触发了火车头的隐藏老板键,找了半天也找到,因为当时编辑的任务还没保存,不 ...
- Laravel上传产品图片Uploading img
这节我们讲Laravel产品图片上传,有很多方式可以实现,这里我们用intervention/image插件来进行.首先安装intervention/image插件,在命令行输入 composer r ...
- ACM-最短路之中的一个个人的旅行——hdu2066
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lx417147512/article/details/27235809 ************** ...
- Git/GitHub基本操作
GitGit是分布式版本控制工具,SVN是集中式版本控制,有单点故障的问题GitHub是Git的代码托管中心,类似的国内有码云,是远程维护库Git的优势大部分操作在本地完成,不需要联网完整性有保证尽可 ...