1247 排排站

USACO

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

FJ的N头奶牛有一些共同之处(1 <= N <= 100,000)。FJ可以将这N头奶牛通过K种特征来归类(1 <= K <= 30)。例如,一些奶牛表现出来的特征1可能是有斑点,特征2可能是较之于PASCAL更喜欢C,等等。

FJ发明了一种简明的描述特征的方法——“特征码”,用一个长度为k的二进制串来表示这头牛的特征表现。例如,一头牛的“特征码”为13,转换为二进制就是1101,代表这头牛具有特征1、3、4 (从右读到左),但是不表现特征2。总的说来,如果这头奶牛表现特征i,那么我们在他的“特征码”的二进制的第i位就为1。

FJ将奶牛排成了一个1..N的队列,他注意到一种确定的排列方法可以使奶牛们的表现更“平衡”。一个连续的i..j的范围平衡表示为如果K种特征都有同样多的奶牛来表现。FJ想知道他究竟可以排出一个多长的“平衡”队列。请帮助他。

输入描述 Input Description

第一行两个整数n和k

接下来n行每行一个整数

输出描述 Output Description

一个整数表示最大的长度

样例输入 Sample Input

7 3 






2

样例输出 Sample Output

4

/*
暴力,将所有特征数字转换为二进制后,存到a[][]数组里,然后竖着看,从每一头牛往下数,找以这头牛为起点的最大长度,这个暴力其实不用hash
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define mod 12200717
int n,m,a[maxn][],h[maxn][],ans;
using namespace std;
void change(int x){
int z=<<(m-),y=a[x][];
for(int i=;i<=m;i++){
if(y-z>=)y-=z,a[x][i]=;
else a[x][i]=;
z>>=;
}
}
void hash(int from,int len,int num){
h[from][num]+=a[from+len-][num];
}
int main(){
freopen("Cola.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i][]);
change(i);
}
int now=;
for(int i=;i<=n;i++){//起点
if(n-i+<=ans)break;
for(int j=;j<=n-i+;j++){//长度
int len=j;
bool flag=;
hash(i,j,);
int st=h[i][];
for(int k=;k<=m;k++){//每头牛的信息
hash(i,j,k);
if(h[i][k]!=h[i][]){
flag=;
}
}
if(flag==)ans=max(ans,len);
}
}
printf("%d",ans);
}

40分 超时

/*
还是差分
因为对于符合条件的序列
有 sj0 - si0 = sj1 - si1 =...= sjk-1 - sik-1
也就是说 如果存在i j 满足
sj1 - sj0 == si1 - si0
sj2 - sj0 == si2 - si0
......
sjk-1 - sj0 == sik-1 - si0
我们定义c[i,j]=s[i,j]-s[i,0]
问题就转化成了 找隔得最远的ij 满足c[i] 和 c[j] 一样
这里用hash加速查找 给每个c[i] 搞一个hash值 放到hash表里
坑死我了,if(r<0) r=-r,查错查了一个小时
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 1000003
int n,m,a[],sum[][],b[][],h[],ans;
int hash(int x){
int r=;
for(int i=;i<=m;i++)r=r%mod+b[x][i]<<;
if(r<)r=-r;
return r%mod;
}
int main(){
scanf("%d%d",&n,&m);
int x;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if((<<(j-))&a[i])sum[i][j]=sum[i-][j]+;
else sum[i][j]=sum[i-][j];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
b[i][j]=sum[i][j]-sum[i][];
}
}
memset(h,-,sizeof(h));
h[]=;
for(int i=;i<=n;i++){
int k=hash(i);
while(h[k]!=-){
int flag=;
for(int j=;j<=m;j++){
if(b[h[k]][j]!=b[i][j]){flag=;break;}
}
if(flag==&&i-h[k]>ans){ans=i-h[k];break;}
k++;
}
if(h[k]==-)h[k]=i;
}
printf("%d",ans);
}

100分

Codevs 1247 排排站的更多相关文章

  1. 1247 排排站 USACO(查分+hash)

    /* 暴力查分 n*n */ #include<cstdio> #include<cstring> #include<iostream> #define maxn ...

  2. [poj3274]排排站(Hash)

    题目:http://poj.org/problem?id=3274 题目大意:http://www.wikioi.com/problem/1247/ (此题中文版) 分析: 令sum[i][j]表示a ...

  3. 如何在Dreamweaver中使用emmet

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3666 一.emmet ...

  4. 【转】准确理解CSS clear:left/right的含义及实际用途

    零.说点什么 好久没更新了.并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少. 今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的. 我们平时 ...

  5. 使用RoboCopy 命令

    经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...

  6. 武汉科技大学ACM:1003: 看美女

    Problem Description “排排站,赏美女……” YJ师兄在今年牡丹江赛区人品爆发,怒摘银奖,心情倍好,现组织大家去黄家湖边站成一排看美女 ^.^ N个人站成一排.不巧,美女们只在队伍的 ...

  7. DRP学习进化模型

    曾经做的就是按照思维做的三级制,这是U .B ,D .坐在坐,开始增加设计模式,增加sqlhelper ,逐渐了解系统可分为只三层,层的,随着学习的不断深入明确了"为什么会出现分层" ...

  8. Robocopy 轉帖

    实例一:文件,想怎么复制就怎么复制 [实现效果] 随时将源文件夹中的纯文本(TXT).Word文档(DOC)还有BMP.TIF图像文件复制到目标文件夹中 ,这是在"资源管理器"中直 ...

  9. Knowledge_SPA——精研查找算法

    首先保证这一篇分析查找算法的文章,气质与大部分搜索引擎搜索到的文章不同,主要体现在代码上面,会更加高级,会结合到很多之前研究过的内容,例如设计模式,泛型等.这也与我的上一篇面向程序员编程--精研排序算 ...

随机推荐

  1. Operation not permitted - /usr/bin/pod

    问题描述:执行sudo gem install cocoapods, 提示出错:While executing gem ... (Errno::EPERM)     Operation not per ...

  2. EasyDarwin实现RTSP播放动态认证的两种方式:Basic/Digest & Token

    问题描述 目前为了能够方便开发者,我们将EasyDarwin中的RTSP认证过程直接忽略过了,如果要开启认证的方式,我们可以在代码中打开: case kRoutingRequest: { // Inv ...

  3. [P2769] 猴子上树

    题目描述 在猴村有一条笔直的山路,这条山路很窄,宽度忽略不计.有 n只猴子正站在山路上静静地观望今天来参加比赛的各位同学.用一个正整数Xi表示第i只猴子所站位置,任意两只猴子的所站位置互不相同.在这条 ...

  4. mac shell命令连接mongo

    1. 安装rebomongo 2. mongo 192.168.1.100/databasename -u lsg -p 123456 3.db.drawspecs.find({name:'prize ...

  5. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

  6. GCD 开启一个定时器实现倒计时功能

    UIAlertView * alt = [[UIAlertView alloc] initWithTitle:@"提示" message:@"操作成功,马上返回继续体验吧 ...

  7. ps 工具栏使用

    1:称动工具,快捷键是v,则选中移动工具:按shift和左键,可移动当前层移到另一层的中间对齐.如果不用sfhift键,则只是移动:alt+左键上移动,则复制层:alt+中间滚轮,则为放大和缩小. 2 ...

  8. Codeforces Round #105 (Div. 2) E. Porcelain —— DP(背包问题)

    题目链接:http://codeforces.com/problemset/problem/148/E E. Porcelain time limit per test 1 second memory ...

  9. codeforces 665B B. Shopping(水题)

    题目链接: B. Shopping time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  10. H3C-交换机端口绑定

    1.端口和MAC地址绑定: (1)使用am命令: [switch]am user-bind mac-address 00e0-fc23-f8d3 interface Ehternet 0/1 (2)使 ...