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行,每行一个整数,表示一种可能下的坏蛋团伙的起始位置.

题解:

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> //by zrt
//problem:
using namespace std;
typedef long long LL;
const int inf(0x3f3f3f3f);
const double eps(1e-9);
int n,k,s;int aa[100005][26],bb[100005][26];int a[100005],b[100005];
bool cmp(int j,int i,int c1,int c2){//b 0...j | a i-j..i
int sum1=0,sum2=0;
for(int k=1;k<c1;k++){
sum1+=j?bb[j-1][k]:0;
}
for(int k=1;k<c2;k++){
sum2+=(i?aa[i-1][k]:0)-((i-j)?aa[i-j-1][k]:0);
}
return sum1==sum2&&(j?bb[j-1][c1]:0)==((i?aa[i-1][c2]:0)-((i-j)?aa[i-j-1][c2]:0));
}
bool cmpp(int j,int i,int c1,int c2){//b 0...j |b i-j..i
int sum1=0,sum2=0;
for(int k=1;k<c1;k++){
sum1+=j?bb[j-1][k]:0;
}
for(int k=1;k<c2;k++){
sum2+=(i?bb[i-1][k]:0)-((i-j)?bb[i-j-1][k]:0);
}
return sum1==sum2&&(j?bb[j-1][c1]:0)==((i?bb[i-1][c2]:0)-((i-j)?bb[i-j-1][c2]:0));
}
int nxt[100005]; void mk_pre(){
for(int i=0;i<n;i++) {
if(i)for(int j=1;j<=s;j++) aa[i][j]=aa[i-1][j];
aa[i][a[i]]++;
}
for(int i=0;i<k;i++) {
if(i)for(int j=1;j<=s;j++) bb[i][j]=bb[i-1][j];
bb[i][b[i]]++;
}
}
void mk(){
int j=-1;
nxt[0]=-1;
for(int i=1;i<k;i++){
while(~j&&!cmpp(j+1,i,b[j+1],b[i])) j=nxt[j];
if(cmpp(j+1,i,b[j+1],b[i])) j++;
nxt[i]=j;
}
} int ans[100005],top;
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
scanf("%d%d%d",&n,&k,&s);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<k;i++){
scanf("%d",&b[i]);
}
mk_pre();// qianzhuihe
mk();
int j=-1;
for(int i=0;i<n;i++){
while(~j&&!cmp(j+1,i,b[j+1],a[i])) j=nxt[j];
if(cmp(j+1,i,b[j+1],a[i])) j++;
if(j==k-1){
ans[top++]=i-j+1;
j=nxt[j];
}
}
printf("%d\n",top);
for(int i=0;i<top;i++){
printf("%d\n",ans[i]);
}
return 0;
}

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

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

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

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

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

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

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

  4. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  5. Bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 深搜,bitset

    1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 554  Solved: 346[ ...

  6. BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )

    有点类似背包 , 就是那样子搞... --------------------------------------------------------------------------------- ...

  7. BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

    题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solve ...

  8. BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐( dfs )

    直接从每个奶牛所在的farm dfs , 然后算一下.. ----------------------------------------------------------------------- ...

  9. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

随机推荐

  1. 百度2015校招二面coding面试题

    window.onload=function(){    document.onclick=function(e){         var ev=e||event;         var targ ...

  2. linux系统安装对硬件有什么要求

    Linux系统对你的硬件要求不是很高,你可以参照你的系统上面的参数进行对照,Linux系统的初衷就是以最低的配置完成最高的性能,随意,现在的计算机都可以安装这个系统的,你不要顾虑多了,但是分区你不用系 ...

  3. 程序员你该学学如何设计PPT了,设计PPT的几大原则

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 大量的汇报及介绍工作,都离不开一个辅助工具-P ...

  4. Linux - 查看系统的版本信息

    在 Linux 中,有多种方法可以查看系统的版本信息. uname 命令 huey@huey-K42JE:~$ uname -a Linux huey-K42JE 3.5.0-43-generic # ...

  5. C#JSON格式数据的转换

    json格式字符串转化为json对象:JObject calculate = (JObject)JsonConvert.DeserializeObject(Rep.Request["data ...

  6. [译]当你在浏览器输入url后发生了什么

    面试题会经常问这个,之前也被问过,回答的不是很好,后来看到百度前端的一篇博客,啰嗦了好多,很么触摸屏都上了..后来看到stackoverflow上的一个回答,比较短. 原文地址:http://stac ...

  7. Kafka-0.10.0.0入门

    搭建环境略(伪集群即可以),但要注意Kafka的配置必须配置的,少配了也一样可以用,但是只能单机使用,外部机器无法连接,网上也有说. host.name=192.168.1.30 advertised ...

  8. HDU分类

    原地址:http://www.byywee.com/page/M0/S607/607452.html 总结了一下ACM STEPS的各章内容,趁便附上我的Steps题号(每人的不一样). 别的,此文首 ...

  9. C++对象创建与释放

    创建对象有以下四种形式: #include <iostream> using namespace std; class A{ private: int i; public: A(){ co ...

  10. 转载:【高并发简单解决方案 | 靠谱崔小拽 】redis队列缓存 + mysql 批量入库 + php离线整合

    需求背景:有个调用统计日志存储和统计需求,要求存储到mysql中:存储数据高峰能达到日均千万,瓶颈在于直接入库并发太高,可能会把mysql干垮. 问题分析 思考:应用网站架构的衍化过程中,应用最新的框 ...