首页 > 分享 > 特殊位置kmp匹配

特殊位置kmp匹配

最新推荐文章于 2019-09-23 21:57:53 发布

QAQQQQQQQQQQQ 于 2018-10-22 16:18:57 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

传送门!
将每个数变成当前位置减上一次出现的位置,用 k m p kmp kmp匹配,但要注意如果当前位置减上一次出现位置的差超过了匹配长度则视为没有出现过,要特判

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define maxn 1000005 #define LL long long using namespace std; int t,n,m,c,a[maxn],b[maxn],pos[maxn],ans[maxn],nxt[maxn]; const int bas=1000003,mod=1e9+7; inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f; } inline bool judge(int x,int y){return b[x]==y||(b[x]==-1 && (x<=y||y==-1));//特判当前数字的位置差>=匹配长度 } int main(){t=rd(); c=rd();while(t--){n=rd(); m=rd(); int tot=0;memset(pos,0,sizeof pos);for(int i=1;i<=n;i++){int x=rd();if(!pos[x]) a[i]=-1,pos[x]=i;else a[i]=i-pos[x],pos[x]=i;}memset(pos,0,sizeof pos);for(int i=1;i<=m;i++){int x=rd();if(!pos[x]) b[i]=-1,pos[x]=i;else b[i]=i-pos[x],pos[x]=i;}for(int i=2,j=0;i<=m;i++){while(j>0 && !judge(j+1,b[i])) j=nxt[j];if(judge(j+1,b[i])) ++j;nxt[i]=j;}for(int i=1,j=0;i<=n;i++){while(j>0 && !judge(j+1,a[i])) j=nxt[j];if(judge(j+1,a[i])) ++j;if(j==m) ans[++tot]=i-m+1,j=nxt[j];}printf("%dn",tot);for(int i=1;i<=tot;i++) printf("%d ",ans[i]); puts("");}return 0; }

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253

相关知识

KMP 字符串匹配 SDNU 1100 字符串查找 HDU 2087 剪花布条
搜索
# KMP , 题目:剪花布条( HDU
HDOJ2087剪花布条 (KMP写法)和(普通写法)
地名地址匹配算法研究
一般图的最大匹配
一般图最大匹配问题
花卉匹配大师下载
心动小镇——特殊鱼类分布/钓鱼位置大全
正则表达式(regex)实现模式匹配

网址: 特殊位置kmp匹配 https://m.huajiangbk.com/newsview1438883.html

所属分类:花卉
上一篇: 【BZOJ4641】—基因改造(
下一篇: 天门冬组织培养茎段消毒试验