https://blog.csdn.net/a302549450/article/details/80948741?tdsourcetag=s_pctim_aiomsg

上面是题解的链接。。,

其实和kmp算法差不多,但是匹配的过程多了一些情况,还是挺有思维性的

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define PI acos(-1)
#define INF 0x3f3f3f3f
#define NUM 101000
#define debug false
#define ll long long
#define lowbit(x) ((-(x))&(x))
#define ffor(i,d,u) for(int i=(d);i<=(u);++i)
#define _ffor(i,u,d) for(int i=(u);i>=(d);--i)
#define mst(array,Num) memset(array,Num,sizeof(array))
const int p = 1e9+;
int n,k,m,_next[NUM],a[NUM<<],b[NUM],ori[NUM<<],par[NUM],pos[];
int ans=;
template <typename T>
void read(T& x)
{
x=;
char c;
while((c=getchar())<''||c>'');
do((x*=)+=((int)(c-'')));while((c=getchar())>=''&&c<='');
}
template <typename T>
void write(T x)
{
int len=;char c[];
if(x<)putchar('-');
x=abs(x);
do{++len;c[len]=(char)((x%)+'');}while(x/=);
_ffor(i,len,)putchar(c[i]);
}
void build()
{
mst(pos,-);
par[]=-;
pos[b[]]=;
ffor(i,,m)
{
if(pos[b[i]]!=-)
par[i]=i-pos[b[i]];
else
par[i]=-;
pos[b[i]]=i;
}
mst(pos,-);
ori[]=-;
pos[a[]]=;
ffor(i,,n)
{
if(pos[a[i]]!=-&&i-pos[a[i]]<m)
ori[i]=i-pos[a[i]];
else
ori[i]=-;
pos[a[i]]=i;
}
}
int getnext(int x)
{
int i;
i=_next[x];
while(i!=- && par[i+]!=par[x+] && par[i+]!=- )i=_next[i];
return i+;
}
bool pd(int x,int y)
{ //母串的x和模式串的y相等 或者 模式串的y无前驱且(y前的长度比x前驱小)
return (ori[x]==par[y] || (par[y]==- && ((y-ori[x])<)));
}
void kmp()
{
_next[]=-;_next[]=;
ffor(i,,m)
_next[i]=getnext(i-);
int i=,j=;
while(j<n)
{
while(i<m&&j<n&&pd(j+,i+)){++i;++j;}
if(i==m)++ans;
if(j==n)break;
while(i==m||(i!=-&&!pd(j+,i+)))i=_next[i];
if(i==-)
{
++i;
++j;
}
}
}
void AC()
{
read(n),read(k);
ffor(i,,n)
read(a[i]);
read(m);
ffor(i,,m)
read(b[i]);
build();
kmp();
write(ans);
}
int main()
{
AC();
return ;
}

kmp变形,带通配符的kmp——华科校赛E 好题的更多相关文章

  1. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  2. ZOJ 3955 Saddle Point 校赛 一道计数题

    ZOJ3955 题意是这样的 给定一个n*m的整数矩阵 n和m均小于1000 对这个矩阵删去任意行和列后剩余一个矩阵为M{x1,x2,,,,xm;y1,y2,,,,,yn}表示删除任意的M行N列 对于 ...

  3. Fire Air(华科校赛 网络赛)

    题目 原题链接:https://www.nowcoder.com/acm/contest/106/L 在100000 * 10000的空地上,有n个时间点,每个时间点会在(xi,yi)上种一棵树. 定 ...

  4. 牛客网-湘潭大学校赛重现H题 (线段树 染色问题)

    链接:https://www.nowcoder.com/acm/contest/105/H来源:牛客网 n个桶按顺序排列,我们用1~n给桶标号.有两种操作: 1 l r c 区间[l,r]中的每个桶中 ...

  5. 算法笔记_216:第六届蓝桥杯软件类校赛部分真题(Java语言C组)

    目录 1 题目一 2 题目二 3 题目三 4 题目四 5 题目五 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 二项式的系数规律,我国数学家很早就发现了. 如[图1.png],我国南宋数学 ...

  6. 算法笔记_215:第六届蓝桥杯软件类校赛部分真题(Java语言B组)

    目录 1 题目一 2 题目二 3 题目三 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 题目一 java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码 ...

  7. 校赛F

    问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...

  8. HDU 4749-Parade Show(KMP变形)

    题意: 给出一个母串和一个模式串求母串中最多能分成最大的子串数(每个字串中的各个数字的大小关系和模式串相同) 分析: KMP变形匹配规则变一下即可,用当前数字和下个数字的差表示,大小关系方便匹配 #i ...

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

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

随机推荐

  1. 多渠道打包工具Walle源码分析

    一.背景 首先了解多渠道打包工具Walle之前,我们需要先明确一个概念,什么是渠道包. 我们要知道在国内有无数大大小小的APP Store,每一个APP Store就是一个渠道.当我们把APP上传到A ...

  2. tftp 服务器的配置

    如果用下面一条命令能够看到服务已经启动, 则不用安装, 否则需要按 1 或 2 点安装 tftp-server 服务器. [arm@localhost arm]#netstat -a | grep t ...

  3. 类 __init__的注意事项

    class Dog():  class类 后面的ClassName类名第一个字母一定要大写. def __init__(self,name,age):    注意init前后是英文格式下,前后都是两道 ...

  4. Kotlin -help

    { kotlin: run Kotlin programs, scripts or REPL. Usage: kotlin <options> <command> <ar ...

  5. Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化--,其作用是能将数据对象存入字节流当中,在需要时重新生成对象.主要应用是利用外部存储设备保存对象状态, ...

  6. Android中的第一个NDK的例子

    前几天研究了JNI技术后,想在Android上试一试研究结果,查阅了很多资料后,总结如下步骤: 首先来看一下什么是NDK NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动 ...

  7. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:代价聚合(Cost Aggregation)

      由于代价计算步骤只考虑了局部的相关性,对噪声非常敏感,无法直接用来计算最优视差,所以SGM算法通过代价聚合步骤,使聚合后的代价值能够更准确的反应像素之间的相关性,如图1所示.聚合后的新的代价值保存 ...

  8. NX二次开发-UFUN获取工程图视图边界线是否显示UF_DRAW_ask_border_display

    #include <uf.h> #include <uf_draw.h> #include <uf_ui.h> UF_initialize(); logical b ...

  9. NX二次开发-NX11创建表达式组NXOpen::ExpressionGroup

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include < ...

  10. Scrapy的初体验

    上一节安装了python2和python3的开发环境 首先第一步:进入开发环境,workon article_spider 进入这个环境: 安装Scrapy,在安装的过程中出现了一些错误:通常这些错误 ...