Description

    约翰的N(1≤N≤100000)只奶牛中出现了K(1≤K≤25000)只爱惹麻烦的坏蛋.奶牛们按一定的顺序排队的时候,这些坏蛋总会站在一起.为了找出这些坏蛋,约翰让他的奶牛排好队进入牛棚,同时需要你的慧眼来识别坏蛋,为了区分,约翰给所有奶牛都发了号牌,上面写着一个1..S(1≤S≤25)之间的数字.虽然这不是一个完美的方法,但也能起一点作用.现在,约翰已经不记得坏蛋们的具体号码.但是凭他的记忆,他给出一个“模式串”.原坏蛋的号码如果相同,模式串中他们的号码依然相同.模式串中坏蛋们之间号码的大小关系也与原号码相同的.比如,对于这样一个模式串:1,4,4,3,,2,1 。原来的6只坏蛋,排最前面的与排最后的号码相同(尽管不一定是1),而且他们的号码在团伙中是最小的.第2,3位置的坏蛋,他们的号码也相同(不一定是4),且是坏蛋团伙中最大的.    现在所有奶牛排成队列,号码依次是这样:    5,6,2,10,10,7,3,2,9存在子串2,10,10,7,3,2,满足模式串的相同关系和大小关系,所以这就是坏蛋团伙, 请找出K个坏蛋的困伙的所有可能性.

Input

    第1行输入三个整数N,K,S.接下来N行每行输入一只牛的号码.接下来K行每行输入一个模式串的号码.

Output

    第1行输出一个整数B.接下来B行,每行一个整数,表示一种可能下的坏蛋团伙的起始位置.

维护第一个串在每个长度为K的区间内对应位置的排名的hash,与第二个串的排名的hash比较

具体可以用树状数组维护小于指定数的数的个数和大于指定数的数对hash值的贡献,详见代码

#include<cstdio>
typedef unsigned long long u64;
int n,k,s;
int t1[],t2[],a[],b[],as[],ap=;
u64 pp[],h2=,h1=,F[],fs=;
const u64 p=;
void add(int*f,int w,int v){
for(;w<=s;w+=w&-w)f[w]+=v;
}
int sum(int*f,int w){
int v=;
for(;w;w-=w&-w)v+=f[w];
return v;
}
void add(int w,u64 v){
fs+=v;
for(;w<=s;w+=w&-w)F[w]+=v;
}
u64 sum(int w){
u64 v=;
for(;w;w-=w&-w)v+=F[w];
return fs-v;
}
char buf[*],*ptr=buf-;
int _(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
int main(){
fread(buf,,sizeof(buf),stdin);
n=_();k=_();s=_();
pp[]=;
for(int i=;i<=n;++i)pp[i]=pp[i-]*p;
for(int i=;i<=n;++i)a[i]=_();
for(int i=;i<=k;++i)b[i]=_();
for(int i=;i<=k;++i){
add(t1,a[i],);
add(a[i],pp[i]);
add(t2,b[i],);
}
for(int i=;i<=k;++i){
h1+=pp[i]*sum(t1,a[i]-);
h2+=pp[i]*sum(t2,b[i]-);
}
if(h1==h2)as[ap++]=;
for(int i=k+,j;i<=n;++i){
j=i-k;
h1-=pp[j]*sum(t1,a[j]-);
h1-=sum(a[j]);
add(t1,a[j],-);
add(a[j],-pp[j]);
h1+=sum(a[i]);
h1+=pp[i]*sum(t1,a[i]-);
add(t1,a[i],);
add(a[i],pp[i]);
if(h1==h2*pp[j])as[ap++]=j+;
}
printf("%d\n",ap);
for(int i=;i<ap;++i)printf("%d\n",as[i]);
return ;
}

bzoj1729: [Usaco2005 dec]Cow Patterns 牛的模式匹配的更多相关文章

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

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

  2. 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划

    [BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...

  3. BZOJ1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 414  Solved: ...

  4. BZOJ 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚

    题目 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farm ...

  5. [Usaco2005 Dec]Cleaning Shifts 清理牛棚 (DP优化/线段树)

    [Usaco2005 Dec] Cleaning Shifts 清理牛棚 题目描述 Farmer John's cows, pampered since birth, have reached new ...

  6. 【BZOJ1731】[Usaco2005 dec]Layout 排队布局 差分约束

    [BZOJ1731][Usaco2005 dec]Layout 排队布局 Description Like everyone else, cows like to stand close to the ...

  7. BZOJ1679: [Usaco2005 Jan]Moo Volume 牛的呼声

    1679: [Usaco2005 Jan]Moo Volume 牛的呼声 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 723  Solved: 346[ ...

  8. BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )

    一开始直接 O( n² ) 暴力..结果就 A 了... USACO 数据是有多弱 = = 先sort , 然后自己再YY一下就能想出来...具体看code --------------------- ...

  9. 3893: [Usaco2014 Dec]Cow Jog

    3893: [Usaco2014 Dec]Cow Jog Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 174  Solved: 87[Submit] ...

随机推荐

  1. LeetCode OJ : Different Ways to Add Parentheses(在不同位置增加括号的方法)

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  2. 防火墙---iptables

    一.iptables的说明及环境安装 (1)理论基础:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或 ...

  3. Linux系统下超级用户密码的修改

    1)重启系统:在虚拟机刚启动界面,不停地按上下键,停止系统的自动引导(界面底部有提示) 2) 按 e 进入编辑模式 3) 编辑内容如下:完成后按Ctrl+x    (具体编辑内容为下图:删除倒数第三行 ...

  4. location.host 与 location.hostname 的区别

    JavaScript 中,大多数情况下,我们不会发现 location.host 与 location.hostname 的区别,因为大多数情况下,我们的网页用的是 80 端口. 他们的区别: loc ...

  5. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  6. 启动Windows防火墙提示“0x8007042c"

    win8.1 启动防火墙是报错:启动Windows防火墙提示“0x8007042c" 一.检查服务 1,右击开始->运行->输入“services.msc” 打开服务 在框中找到 ...

  7. artDialog的使用

    用法一:github上下载包:https://github.com/aui/artDialog                seajs方法使用 <!doctype html> <h ...

  8. Postfix常用命令和邮件队列管理(queue)

    本文主要介绍一下postfix的常用命令及邮件队列的管理: Postfix有以下四种邮件队列,均由管理队列的进程统一进行管理: maildrop:本地邮件放置在maildrop中,同时也被拷贝到inc ...

  9. I.MX6 Linux eGTouch TouchScreen porting

    I.MX6 Linux eGTouch TouchScreen porting 一.Download Driver: http://www.eeti.com.tw/drivers_Linux.html ...

  10. skywalking探针tomcat8.0.28报错解决

    在部署skywalking agent的时候遇到一个异常 环境如下: tomcat8.0.28 catalina.out 日志报如下错误 30-Apr-2019 10:25:57.664 INFO [ ...