[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; }