本篇题解用于作者本人加深理解,也欢迎大家阅读。


这道题的正解是\(KMP\)加上树状数组,记录每一个位置前几个位置比其小的、相等的、大的数的数量,比较方式便是比较相应的数量,若相等,则匹配成功。

但是本篇题解使用了\(Hash\)的做法,因为\(1<=s<=25\),所以我们可以利用一个数组,并利用二进制的压缩方式,记录每一个数存在的位置。即:

\(hash[i]\)表示数字\(i\)在\(k\)的长度中出现的位置的二进制压缩。

如\(hash[i]=1000101_2\)就表示\(i\)在长度为\(k=7\)的序列内出现在了\(1,5,7\)的位置(\(or\)出现在了\(1 ,3,7\)的位置(看个人理解)),接着再按照\(s\)从小到大比较二进制压缩,即可判断是否一致。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100005,M=25005,S=30,MOD=7710343;
int n,m,s,len;
int a[N],b[M];
ll ksm[M],hsa[S],hsb[S];
int ans[N],lans=0;
inline int read()
{
char c=getchar();
while(c<'0'||'9'<c)
c=getchar();
int x=0;
while('0'<=c&&c<='9')
{
x*=10;
x+=c-'0';
c=getchar();
}
return x;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=m;++i)
b[i]=read();
ksm[0]=1;
for(int i=1;i<=m;++i)
ksm[i]=ksm[i-1]*2%MOD;
for(int i=1;i<=m;++i)
{
len=max(len,b[i]);
for(int j=1;j<=s;++j)
{
hsb[j]=(hsb[j]*2+(b[i]==j))%MOD;
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=s;++j)
{
hsa[j]=(hsa[j]*2+(a[i]==j))%MOD;
}
if(i>=m)
{
// printf("%d\n",i-m+1);
bool ok=true;
int aa=1,bb=1,cnt=0;
while(aa<=s&&bb<=s)
{
while(aa<=s&&!hsa[aa])
++aa;
while(bb<=s&&!hsb[bb])
++bb;
if(aa>s||bb>s)
break;
if(hsa[aa]==hsb[bb])
{
++cnt;
// printf("%d %d\n",aa,bb);
}
else
{
ok=false;
break;
}
++aa;
++bb;
}
// printf("%d %d %d\n",cnt,len,ok);
if(cnt==len&&ok)
ans[++lans]=i-m+1;
for(int j=1;j<=s;++j)
{
hsa[j]=((hsa[j]-ksm[m-1]*(a[i-m+1]==j))%MOD+MOD)%MOD;
}
}
}
printf("%d\n",lans);
for(int i=1;i<=lans;++i)
printf("%d\n",ans[i]);
return 0;
}

SP7022 CPATTERN - Cow Patterns的更多相关文章

  1. 【POJ 3167】Cow Patterns (KMP+树状数组)

    Cow Patterns Description A particular subgroup of K (1 <= K <= 25,000) of Farmer John's cows l ...

  2. 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)

    题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...

  3. BZOJ 1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配

    Description 约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的奶牛排好 ...

  4. POJ 3167 Cow Patterns(模式串浮动匹配)

    题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...

  5. bzoj1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配

    Description     约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的 ...

  6. POJ 3167 Cow Patterns (KMP+前缀和)

    题意:给你两串数字,长度分别为n和m,数字大小在[1,25].当后一串数字每个数字的排名位置与前一串数字(任一长度为m的子串)每个数字的排名位置一致时就完全匹配,最后求哪些位置是完全匹配的. 例如:1 ...

  7. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  8. bzoj usaco 金组水题题解(2.5)

    bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是 ...

  9. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

随机推荐

  1. yum 的一些问题总结

    1. yum 只删除目标,不删除依赖 rpm -e --nodeps xxx 2.yum remove 出错 报错 Error: Cannot retrieve repository metadata ...

  2. Adaboost算法的一个简单实现——基于《统计学习方法(李航)》第八章

    最近阅读了李航的<统计学习方法(第二版)>,对AdaBoost算法进行了学习. 在第八章的8.1.3小节中,举了一个具体的算法计算实例.美中不足的是书上只给出了数值解,这里用代码将它实现一 ...

  3. Java并发编程 - Runnbale、Future、Callable 你不知道的那点事(一)

    从事Java开发已经快两年了,都说Java并发编程比较难,比较重要,关键面试必问,但是在我的日常开发过程中,还真的没有过多的用到过并发编程:这不疫情嘛,周末不能瞎逛,就看看师傅们常说的 Runnabl ...

  4. day95:flask:SQLAlchemy数据库查询进阶&关联查询

    目录 1.数据库查询-进阶 1.常用的SQLAlchemy查询过滤器 2.常用的SQLAlchemy查询结果的方法 3.filter 4.order_by 5.count 6.limit&of ...

  5. kali Linux的 安装详细步骤

    一.打开"kali 官方网站,下载kali镜像文件.地址(https://www.kali.org/downloads/)   在Download菜单界面下,有历史版本下载和最新版下载.找到 ...

  6. 自定义IDM的网页嗅探下载浮条样式

    如果大家有用过IDM(Internet Download Manager)下载器的朋友应该会知道,我们在安装完IDM后,打开网页时,有时网页上会出现一个IDM的下载浮窗,这就是IDM的嗅探下载浮条. ...

  7. Mac支持的网络游戏有哪些?怎么支持Windows游戏?

    "游戏是这个世界上唯一能和女性争夺男朋友的东西(/滑稽,有不少女生也喜欢玩游戏)."虽然只是一句玩笑话,不过也可以看出游戏对大多数男生来说是必不可少的一项娱乐活动了.而网络游戏是游 ...

  8. 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...

  9. 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!

    摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...

  10. 简化的鸿蒙WiFi接口,仅需几行代码,简单易用!

    使用鸿蒙原始WiFI API接口进行编程,整个过程稍显繁琐,为此我们对鸿蒙原始WiFi API接口做了一层封装,形成了一套更简单易用的接口. 简化后的API接口 STA模式 // 连接WiFi热点,并 ...