POJ 3167 Cow Patterns (KMP+前缀和)
题意:给你两串数字,长度分别为n和m,数字大小在[1,25]。当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的。
例如:1 4 2 5 3 6 与 1 3 2 4 答案就是:1 3(第一串数字的第一个位置开始与第三个位置开始)
挺难想的一个题,我们需要使用dp的思想加前缀和进行KMP匹配
首先,两串数字串完全匹配就可以想到KMP,这样我们就只需要解决一个问题:两个数字怎样才算是“相等”(这儿并不是值一样就“相等”)。我们可以这样想,当两串数字对应位置:前面比此位置数字小的,与此位置数字相等的个数都一样,这样就一定匹配,因为这样每个数字排名位置一定相等(注意第一个数字串是子串)。
我们可以注意数字范围很小,所以可以使用前缀和记录:每个位置前面每种数字不大于这个数字大小的个数。这样求Next数组和匹配时直接使用前缀和来处理就好。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1E-8
/*注意可能会有输出-0.000*/
#define Sgn(x) (x<-eps? -1 :x<eps? 0:1)//x为两个浮点数差的比较,注意返回整型
#define Cvs(x) (x > 0.0 ? x+eps : x-eps)//浮点数转化
#define zero(x) (((x)>0?(x):-(x))<eps)//判断是否等于0
#define mul(a,b) (a<<b)
#define dir(a,b) (a>>b)
typedef long long ll;
typedef unsigned long long ull;
const int Inf=<<;
const double Pi=acos(-1.0);
const int Mod=1e9+;
const int Max=;
int Next[Max],k;
struct node//前i个字符中大于等于某种数字的总个数
{
int num[Max][];
};
void Init(int n,int *str,node &dp)//预处理dp
{
memset(dp.num[],,sizeof(dp.num[]));
for(int i=;i<n;++i)
{
dp.num[i][]=;
for(int j=;j<=k;j++)
{
dp.num[i][j]=dp.num[i-][j];
if(j>=str[i-])
dp.num[i][j]=dp.num[i-][j]+;
}
}
return;
}
int Jud(int i,int j,node &dpm,node &dpp,int *strm,int *strp)//模式串与匹配串是否匹配
{
int lim=j-i;
if(dpm.num[i][strm[i]]==dpp.num[j][strp[j]]-dpp.num[lim][strp[j]]&&dpm.num[i][strm[i]-]==dpp.num[j][strp[j]-]-dpp.num[lim][strp[j]-])//这儿使用前缀和计算时要注意固定不大于某个值
return ;
return ;
}
void GetNext(int m,int *str,node &dp)//求next数组
{
Next[]=-;
int i=-,j=;
while(j<m)
{
if(i==-||Jud(i,j,dp,dp,str,str))//当此字符前面小于等于其的都相等时就匹配
{
++i,++j;
Next[j]=i;
}
else
i=Next[i];
}
return;
}
int strm[Max],strp[Max];
node dpm,dpp;
int ans[Max],cnt;
int Kmp(int n,int m)//标准模式匹配修改
{
int res=;
int i=,j=;
while(j<n)
{
if(i==-||Jud(i,j,dpm,dpp,strm,strp))
{
++i,++j;
}
else
i=Next[i];
if(i==m)//匹配成功
{
ans[cnt++]=j-i+;
i=Next[i];
res++;
}
}
return res;
}
int main()
{
int n,m;
while(~scanf("%d %d %d",&n,&m,&k))
{
cnt=;
for(int i=;i<n;++i)
scanf("%d",&strp[i]);
for(int i=;i<m;++i)
scanf("%d",&strm[i]);
Init(m,strm,dpm);
GetNext(m,strm,dpm);
Init(n,strp,dpp);
int len=Kmp(n,m);
printf("%d\n",len);
for(int i=;i<len;++i)
printf("%d\n",ans[i]);
}
return ;
}
POJ 3167 Cow Patterns (KMP+前缀和)的更多相关文章
- POJ 3167 Cow Patterns(模式串浮动匹配)
题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...
- POJ 3167 Cow Pattern ★(KMP好题)
题意 给你一个数字序列S,再给一个数字序列pattern,S和pattern中的数字都是1到s(s<=25).每个序列里的数字都有个排名,也就是第几小,现在我们要用pattern来匹配S.在本题 ...
- 【POJ 3167】Cow Patterns (KMP+树状数组)
Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...
- POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)+后缀数组模板
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7586 Accepted: 3448 Cas ...
- POJ 3045 Cow Acrobats (贪心)
POJ 3045 Cow Acrobats 这是个贪心的题目,和网上的很多题解略有不同,我的贪心是从最下层开始,每次找到能使该层的牛的风险最小的方案, 记录风险值,上移一层,继续贪心. 最后从遍历每一 ...
- poj 3348 Cow 凸包面积
Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8122 Accepted: 3674 Description ...
- POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包)
POJ 3660 Cow Contest / HUST 1037 Cow Contest / HRBUST 1018 Cow Contest(图论,传递闭包) Description N (1 ≤ N ...
- POJ 3176 Cow Bowling(dp)
POJ 3176 Cow Bowling 题目简化即为从一个三角形数列的顶端沿对角线走到底端,所取得的和最大值 7 * 3 8 * 8 1 0 * 2 7 4 4 * 4 5 2 6 5 该走法即为最 ...
- POJ 2184 Cow Exhibition【01背包+负数(经典)】
POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...
随机推荐
- PHP中导出Excel,将数据以Excel形式导出
现在,很多地方都需要导出数据,这里说一种简单的方法将数据以Excel的形式导出,方法如下: <?php date_default_timezone_set('PRC');//设置时区 /*设置h ...
- [Spring Data Repositories]学习笔记--使用现有的repository
以下内容是在学习Spring-Data-mongoDB中的Spring Data Repositories时做的一些笔记.备忘! 感觉学习还是看官方的资料比较透彻一些. Spring Data Rep ...
- 学生成绩管理系统【c】
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #d ...
- EasyNVR无插件直播流媒体服务器云端集中管控的EasyNVS云管理平台安装使用文档
EasyNVS - EasyNVR云端集中管理服务 EasyNVS云管理平台是一套专门用于集中化管理EasyNVR 的解决方案. EasyNVR 采用主动注册的方式接入到 EasyNVS, 再由 Ea ...
- 一直没有敢发的NOIP2018游记
一直没有敢发的NOIP2018游记 NOIP2018游记 教练说知足是最好的,尽吾志而也不能及者,可以无悔矣.在这次考试中的表现令我还是十分满意的.(笑) D1 T0 我配置背得感觉很好,我考场上直接 ...
- 洛谷 P2523 [HAOI2011]Problem c
洛谷1或洛谷2,它们是一样的题目,手动滑稽- 这一题我是想不出来, 但是我想吐槽一下坐我左边的大佬. 大佬做题的时候,只是想了几分钟,拍了拍大腿,干脆的道:"这不是很显然吗!" 然 ...
- python并发编程&IO模型
一 IO模型介绍 为了更好地了解IO模型,可先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(n ...
- 002-JVM运行时数据区【内存模型】
一.概述 JVM定义了不同运行时数据区,他们是用来执行应用程序的.某些区域随着JVM启动及销毁,另外一些区域的数据是线程性独立的,随着线程创建和销毁. 1.1.jvm自身物理结构 1.2.java内存 ...
- CRC冗余校验码的介绍和实现
from:http://yoyo.play175.com/p/200.html 节选至百度百科: 首先,任何一个由二进制数位串组成的代码,都可以惟一地与一个只含有0和1两个系数的多项式建立一一对应的关 ...
- Linux Shell编程 sort、wc命令
sort命令:字符串排序 sort 命令可以依据不同的数据类型来进行排序.sort 将文件的每一行作为一个单位,相互比较.比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出 ...