POJ3274
2015-12-02 23:54
357 查看
题意大概是:输入N只牛和这些牛最多具有k个特征,接下来输入N行。,每行一个数字,转换成二进制,表示该只牛具有哪些特征。
求找到最大的区间长度使在那个区间内每种特征的总数一样。
用feature【i】【j】表示第i只牛是否具有j特征,是则为1,否则为0。
用sum【i】【j】存储从第一只到第i只牛具有特征j的总数。
题目要求求得
sum[i][1]-sum[j][1]==sum[i][2]-sum[j][2]=......=sum[i][k]-sum[j][k];
使i-j最大;
转化上式得sum[i][2]-sum[i][1]==sum[j][2]-sum[j][1];
sum[i][3]-sum[i][1]==sum[j][3]-sum[j][1];
.
.
.
.
.
.
sum[i][k]-sum[i][1]==sum[j][k]-sum[j][1];
用cal【i】【j】存储sum[i][j]-sum[i][1]的值;
只需找到cal[i][]==cal[j][]中最大的i-j即可。
g++会爆
求找到最大的区间长度使在那个区间内每种特征的总数一样。
用feature【i】【j】表示第i只牛是否具有j特征,是则为1,否则为0。
用sum【i】【j】存储从第一只到第i只牛具有特征j的总数。
题目要求求得
sum[i][1]-sum[j][1]==sum[i][2]-sum[j][2]=......=sum[i][k]-sum[j][k];
使i-j最大;
转化上式得sum[i][2]-sum[i][1]==sum[j][2]-sum[j][1];
sum[i][3]-sum[i][1]==sum[j][3]-sum[j][1];
.
.
.
.
.
.
sum[i][k]-sum[i][1]==sum[j][k]-sum[j][1];
用cal【i】【j】存储sum[i][j]-sum[i][1]的值;
只需找到cal[i][]==cal[j][]中最大的i-j即可。
g++会爆
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <stdlib.h> using namespace std; #define N 100011 int feature[N][35]; int sum[N][35],cal[N][35]; const int mod=3000001; int n,m,maxlen; typedef class Hash { public: int pos; Hash *next; Hash(){next=0;} }Hashtable; Hashtable* hash[mod]; bool cmp(int x,int y) { for(int i=1;i<=m;i++) if(cal[x][i]!=cal[y][i])return false; return true; } void Hash(int cur) { int key=0; for(int i=1;i<=m;i++) key+=cal[cur][i]*i; key=abs(key)%mod; if(!hash[key]) { Hashtable *p=new Hashtable; p->pos=cur; hash[key]=p; } else { Hashtable *p=hash[key]; if(cmp(cur,p->pos)) { int len=cur-(p->pos); maxlen=max(maxlen,len); return; } else { while(p->next) { if(cmp(cur,p->next->pos)) { int len=cur-(p->next->pos); maxlen=max(maxlen,len); return; } p=p->next; } Hashtable *temp=new Hashtable; temp->pos=cur; p->next=temp; } } return ; } int main() { cin>>n>>m; int f; for(int i=0;i<=m;i++) { cal[0][i]=sum[0][i]=0; } memset(hash,0,sizeof(hash)); Hash(0); maxlen=0; for(int i=1;i<=n;i++) { cin>>f; for(int j=1;j<=m;j++) { feature[i][j]=f%2; f=f/2; sum[i][j]=sum[i-1][j]+feature[i][j]; cal[i][j]=sum[i][j]-sum[i][1]; } Hash(i); } cout<<maxlen<<endl; return 0; }
相关文章推荐
- Search a 2D Matrix
- 安卓APP加载HTML5页面解决方案总结
- 开个CS5.4编译编译,调试错误贴
- 高程8.2location对象 8.3navigator对象
- First Bad Version
- hibernate 延迟加载(转载)
- Android Accessing Resources
- 第二章 观察者模式
- mysql数据库常用语句2
- Day2. 页面基本布局、初始化
- Iterator的remove()和Collection的remove()
- 『《数据挖掘导论》读书笔记(一)』——数据
- JS案例练习:图片切换+切换模式
- 森林病虫防治系统 (十)
- 初学安卓
- 1052. Linked List Sorting (25)
- java根据Map的值删除HashMap中的对象元素
- iOS GCD
- 消息中间件选型
- AES加密 java&c++版本