这题说的是给了一个模板串 然后又给了一个串 需要找出类似的按个模板串 , 改相等的位置要相等 该大于的位置到大于

我们将模板串做好失配指针就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改进的更多相关文章

  1. hdu4749 kmp应用

    呃,从网上看的题解,然而其实有点地方还没搞懂,先放在这,以后再回来理解. 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目:2013 is ...

  2. 字符串匹配(BF算法和KMP算法及改进KMP算法)

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include<cstring> ...

  3. c语言KMP匹配算法与字符串替换算法

    一.字符串匹配算法 (1)传统匹配算法BF int Index_BF(char* S, char* T){ int i=1,j=1; while(i<=strlen(S) && ...

  4. kpm字符串匹配算法

    首先是简单的朴素匹配算法 /* * 返回子串t在主串s的位置,若不存在则返回0 */ public static int index(String s, String t) { int i = 0;/ ...

  5. 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现

    1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...

  6. KMP及其改进算法

    本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...

  7. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

  8. 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    --喜欢记得关注我哟[shoshana]-- 目录 1.朴素的模式匹配算法2.KMP模式匹配算法 2.1 KMP模式匹配算法的主体思路 2.2 next[]的定义与求解 2.3 KMP完整代码 2.4 ...

  9. KMP算法的改进

    KMP算法的改进 KMP算法已经在极大程度上提高了子符串的匹配效率,但是仍然有改进的余地. 1. 引入的情景 下面我们就其中的一种情况进行分析: 主串T为"aaaabcde-" 子 ...

随机推荐

  1. JAVA常用的异常处理情况

    从编程到现在,遇见过很多次程序崩的情况,好多时候都不知道怎么去解决才好,一般性解决就是百度或者问别人,但是每一次百度解决的下一次还是会遇见同样的问题,也没有系统的整理梳理过相关的处理异常的知识,再一次 ...

  2. disruptor的并行用法

    实现EventFactory,在newInstance方法中返回,ringBuffer缓冲区中的对象实例:代码如下: public class DTaskFactory implements Even ...

  3. UI自动化遇到的问题

    1.找不到元素:查看是否有[frame]或者[iframe]元素 2.click无响应:1)使用sendkeys(Keys.Enter) 还是无响应:使用js定位 3.弹框处理: 确认:switcht ...

  4. gpg签名用法

    – 在CentOS 6上生成公钥/私钥对 [root@localhost ~]# gpg --gen-key gpg (GnuPG) ; Copyright (C) Free Software Fou ...

  5. JdbcTemplate中向in语句传参

    spring jdbc包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和NamedParameterJdbcTemplate,我们先从JdbcTemplate入手, ...

  6. 认识程序的执行:从高级语言到二进制,以java为例

    java 高级编程语言,面向对象*.java是源码文件*.class是字节码文件,一种中间文件. JDK包含的基本组件包括: javac – 编译器,将源程序转成字节码 jar – 打包工具,将相关的 ...

  7. Linux中程序开机自启

    Linux中程序开机自启 https://www.itbulu.com/debian-ubuntu-rclocal.html

  8. finecms如何调用多个栏目的子栏目

    前面我们说到了finecms如何调用多个指定栏目的内容,finecms如何调用多个栏目的子栏目呢?用下面的代码就可以实现了,其中id是具体的栏目id,用“,”逗号隔开 {list action=cat ...

  9. 启动Jmeter4.0 后弹出警告: WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0 x80000002. Windows RegCreateKeyEx(...) returned error code 5.

    启动Jmeter4.0 后弹出命令窗口提示信息: WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at r ...

  10. CA证书和TLS介绍

    数字签名 用自己的私钥给数据加密就叫数字签名 公钥传输威胁 在A和B的通信中,C可以把自己的公钥发给A,让A把C的公钥当成B的公钥,这样的话.B拿到加密数据反而无法解密,而C却可以解密出数据.从而实现 ...