NEERC13 Problem H.Hack Protection
生活随笔
收集整理的這篇文章主要介紹了
NEERC13 Problem H.Hack Protection
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NEERC13 Problem H.Hack Protection
Solution
注意到題目中的區間與,在左端點lll確定的情況下,對于所有r≥lr\geq lr≥l,ANDl,rAND_{l,r}ANDl,r?只有logloglog種取值,這是一個極為常見的性質。
于是我們從大到小枚舉lll,可以維護每一位什么時候變成000,即可求出每一段(li,ri,xi)(l_i,r_i,x_i)(li?,ri?,xi?)表示ANDl,t∈[li,ri]=xiAND_{l,t\in [l_i,r_i]}=x_iANDl,t∈[li?,ri?]?=xi?,用異或前綴和SiS_iSi?表示ANDl,t=StxorSl?1AND_{l,t}=S_t\ xor\ S_{l-1}ANDl,t?=St??xor?Sl?1?,就變成求St=Sl?1xorxi,t∈[l,r]S_t=S_l-1\ xor \ x_i,t\in[l,r]St?=Sl??1?xor?xi?,t∈[l,r]的個數,直接離散化之后用vectorvectorvector維護即可。
Code
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; } template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int,int> PR; typedef vector<int> VI;const lod eps=1e-11; const lod pi=acos(-1); const int oo=1<<30; const ll loo=1ll<<62; const int mods=998244353; const int MAXN=200005; const int INF=0x3f3f3f3f;//1061109567 /*--------------------------------------------------------------------*/ inline int read() {int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } ll ans=0; map<int,int> Map; vector<int> V[MAXN]; int nxt[35],a[MAXN],s[MAXN]; set<PR> Set; int solve(int l,int r,int x) {if (l>r||!Map.count(x)) return 0;int t=Map[x];return lower_bound(V[t].begin(),V[t].end(),-l+1)-lower_bound(V[t].begin(),V[t].end(),-r); } signed main() { // freopen("hack.in","r",stdin); // freopen("hack.out","w",stdout);int n=read(),num=0;for (int i=1;i<=n;i++) {a[i]=read(),s[i]=s[i-1]^a[i];if (!Map.count(s[i])) Map[s[i]]=++num;}for (int i=0;i<31;i++) nxt[i]=n+1,Set.insert(MP(n+1,i));for (int i=n;i>=1;i--){for (int j=0;j<31;j++) if (!((a[i]>>j)&1)) Set.erase(MP(nxt[j],j)),nxt[j]=i,Set.insert(MP(nxt[j],j));V[Map[s[i]]].PB(-i);int lst=i,nw=(oo-1)<<1|1;for (set<PR>::iterator it=Set.begin();it!=Set.end();++it) ans+=solve(lst,(it->fi)-1,s[i-1]^nw),nw^=(1<<(it->se)),lst=(it->fi);ans+=solve(lst,n,s[i-1]^nw);}printf("%lld\n",ans);return 0; }總結
以上是生活随笔為你收集整理的NEERC13 Problem H.Hack Protection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无需QQ密保直接修改QQ密码
- 下一篇: ARC068C - Snuke Line