poj3274
来源:互联网 发布:byte数组转string乱码 编辑:程序博客网 时间:2024/05/01 07:04
题意:
解法:bit[i][j]记录着前i个数中,j位有多少个,然后通过以下几行乱搞了一个hash:
for(int j=0;j<k;j++) mi=min(mi,bit[i][j]); for(int j=0;j<k;j++) tool+=(long long)(1<<(j%15))*(bit[i][j]-mi); tool%=inf;
然后去找i前面tool值一样的再一位一位比较;
代码:#include <iostream>#include <vector>#include <stdio.h>#include <cstring>#define inf 999983using namespace std;int n,k;int num[100010];long long bit[100010][32];vector<vector<int> > vec;bool judge(int i,int j){ int tool=-1; for(int p=0;p<k;p++) { if(tool==-1||bit[i][p]-bit[j][p]==tool) tool=bit[i][p]-bit[j][p]; else { return false; } } return true;}int main(){ while(scanf("%d%d",&n,&k)==2) { vec.clear(); memset(num,0,sizeof num); memset(bit,0,sizeof bit); vec.resize(1000000); for(int i=0;i<n;i++) { scanf("%d",num+i); } for(int i=1;i<=n;i++) { for(int j=0;j<k;j++) { bit[i][j]=bit[i-1][j]; if(num[i-1]&(1<<j)) bit[i][j]++; } } int ans=0; for(int i=0;i<=n;i++) { long long mi=1000000000; long long tool=0; for(int j=0;j<k;j++) mi=min(mi,bit[i][j]); for(int j=0;j<k;j++) tool+=(long long)(1<<(j%15))*(bit[i][j]-mi); tool%=inf; for(int j=0;j<vec[tool].size();j++) { if(judge(i,vec[tool][j])) ans=max(ans,i-vec[tool][j]);//,cout<<i<<" "<<vec[tool][j]<<endl; } //cout<<ans<<endl; vec[tool].push_back(i); } printf("%d\n",ans); } return 0;}
0 0
- POJ3274
- poj3274
- poj3274
- poj3274
- poj3274
- poj3274
- POJ3274
- poj3274
- poj3274 hash
- poj3274 hash
- Gold Balanced Lineup poj3274
- POJ3274 Gold Balanced Lineup
- poj3274 hash数组
- poj3274数位HASH
- poj3274 Gold Balanced Lineup
- [POJ3274]-Gold Balanced Lineup
- [POJ3274] Gold Balanced Lineup
- poj3274(数字hash)
- UFLDL学习笔记5(Building Deep Networks for Classification)
- poj试题分类
- java.lang.NoClassDefFoundError: com.google.gson.stream.JsonReader 类似的在eclipse通过bulidpath导入包发生异常
- java中write(byte[] b)与write(byte[] b,int off,int len)区别
- gcc编译c++程序
- poj3274
- 文件读写
- Linux Disk utilization iostat
- win7要用到很多运行命令
- hdu1128解题报告
- 输出去除数字后的字符串
- 盗版XP成主要恶意攻击对象
- 硬盘
- 盗版XP成主要恶意攻击对象