[USACO07MAR]黄金阵容均衡【前缀和】

难得了啊,有这种训练思维的好题。

很容易想到整体状态的前缀和,此时为了避免$O(n^2)$的枚举和之前的哪一个相同,我们一直保持1这种属性不变,一旦哪一天给1加了,就给所有的属性减一,这样在某一段整体增量相同的时间里面,所有属性保持的状态相同,用Hash或者vector存状态,使用map来查找。

CODE:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
map<vector<int>,int> mp;
int n,m,x;
int ans;

int main()
{
	scanf("%d%d",&n,&m);
	vector<int> vis(m);
	mp[vis]=0;
	for(int t=1;t<=n;t++)
	{
		scanf("%d",&x);
		for(int i=0;i<m;i++)
			if(x&(1<<i)) 
			vis[i]++;
		if(x&1) for(int i=0;i<m;i++) vis[i]--;
		if(mp.count(vis)) ans=max(ans,t-mp[vis]);
		else mp[vis]=t;
	}
	printf("%d",ans);
	return 0;
}

  

posted @ 2018-06-14 13:28  Captain_fcj  阅读(211)  评论(0编辑  收藏  举报