Subject to the effect:
slightly.
analysis:
This question is the "exclusive or maximum value LeetCode array of two numbers," an upgraded version, due to the positive and negative, so the first sign bit to be discussed separately after obtaining the prefix and XOR.
PS: When there is only one number should be discussed separately
code show as below:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (int)(n); ++i) 6 #define For(i,s,t) for (int i = (int)(s); i <= (int)(t); ++i) 7 #define rFor(i,t,s) for (int i = (int)(t); i >= (int)(s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i) 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) 12 13 #define pr(x) cout << #x << " = " << x << " " 14 #define prln(x) cout << #x << " = " << x << endl 15 16 #define LOWBIT(x) ((x)&(-x)) 17 18 #define ALL(x) x.begin(),x.end() 19 #define INS(x) inserter(x,x.begin()) 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end()) 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end()); // 删去 x 中所有 c 22 #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower); 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper); 24 25 #define ms0(a) memset(a,0,sizeof(a)) 26 #define msI(a) memset(a,0x3f,sizeof(a)) 27 #define msM(a) memset(a,-1,sizeof(a)) 28 29 #define MP make_pair 30 #define PB push_back 31 #define ft first 32 #define sd second 33 34 template<typename T1, typename T2> 35 istream &operator>>(istream &in, pair<T1, T2> &p) { 36 in >> p.first >> p.second; 37 return in; 38 } 39 40 template<typename T> 41 istream &operator>>(istream &in, vector<T> &v) { 42 for (auto &x: v) 43 in >> x; 44 return in; 45 } 46 47 template<typename T> 48 ostream &operator<<(ostream &out, vector<T> &v) { 49 Rep(i, v.size()) out << v[i] << " \n"[i == v.size() - 1]; 50 return out; 51 } 52 53 template<typename T1, typename T2> 54 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 55 out << "[" << p.first << ", " << p.second << "]" << "\n"; 56 return out; 57 } 58 59 inline int gc(){ 60 static const int BUF = 1e7; 61 static char buf[BUF], *bg = buf + BUF, *ed = bg; 62 63 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 64 return *bg++; 65 } 66 67 inline int ri(){ 68 int x = 0, f = 1, c = gc(); 69 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 70 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 71 return x*f; 72 } 73 74 template<classT> 75 inline String toString (T x) { 76 ostringstream Sout; 77 Sout << x; 78 return sout.str (); 79 } 80 81 inline int toInt ( string s) { 82 int in; 83 istringstream son (s); 84 son >> in; 85 return to; 86 } 87 88 // min <= AIM <= max 89 template <typename T> 90 inline bool BETWEEN(const T aim, const T min, const T max) { 91 return min <= aim && aim <= max; 92 } 93 94 typedef unsigned int uI; 95 typedef long long LL; 96 typedef unsigned long long uLL; 97 typedef vector< int > VI; 98 typedef vector< bool > VB; 99 typedef vector< char > VC; 100 typedef vector< double > VD; 101 typedef vector< string > VS; 102 typedef vector< LL > VL; 103 typedef vector< VI > VVI; 104 typedef vector< VB > VVB; 105 typedef vector< VS > VVS; 106 typedef vector< VL > VVL; 107 typedef vector< VVI > VVVI; 108 typedef vector< VVL > VVVL; 109 typedef pair< int, int > PII; 110 typedef pair< LL, LL > PLL; 111 typedef pair< int, string > PIS; 112 typedef pair< string, int > PSI; 113 typedef pair< string, string > PSS; 114 typedef pair< double, double > PDD; 115 typedef vector< PII > VPII; 116 typedef vector< PLL > VPLL; 117 typedef vector< VPII > VVPII; 118 typedef vector< VPLL > VVPLL; 119 typedef vector< VS > VVS; 120 typedef map< int, int > MII; 121 typedef unordered_map< int, int > uMII; 122 typedef map< LL, LL > MLL; 123 typedef map< string, int > MSI; 124 typedef map< int, string > MIS; 125 typedef multiset< int > mSI; 126 typedef multiset< char > mSC; 127 typedef set< int > SI; 128 typedef stack< int > SKI; 129 typedef stack< char > SKC; 130 typedef deque< int > DQI; 131 typedef queue< int > QI; 132 typedef priority_queue< int > PQIMax; 133 typedef priority_queue< int, VI, greater< int > > PQIMin; 134 const double EPS = 1e-8; 135 const LL inf = 0x7fffffff; 136 const LL infLL = 0x7fffffffffffffffLL; 137 const LL mod = 1e9 + 7; 138 const int maxN = 1e5 + 7; 139 const LL ONE = 1; 140 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 141 const LL oddBits = 0x5555555555555555; 142 143 class Trie { 144 public: 145 Trie* nxt[2]; 146 147 Trie() { 148 nxt[0] = nxt[1] = NULL; 149 } 150 151 void insert(string word) { 152 Trie* p = this; 153 Rep(i, word.size()) { 154 int key = word[i] - '0'; 155 156 if(p->nxt[key] == NULL) { 157 p->nxt[key] = new Trie(); 158 } 159 P = p-> NXT [Key]; 160. } 161 } 162 163 int Solve ( String Word) { 164 is int RET = 0 ; 165 LL mask = (ONE << 31 is ); 166 167 is Trie * P = the this ; 168 int Key Word = [ 0 ] - ' 0 ' ; 169 IF (p-> NXT [Key] == NULL) { // sign bit separately discussed 170. RET | = mask; 171 is key = !key; 172 } 173 mask >>= 1; 174 p = p->nxt[key]; 175 176 For(i, 1, word.size() - 1) { 177 key = word[i] - '0'; 178 179 if(p->nxt[!key] != NULL) { 180 ret |= mask; 181 key = !key; 182 } 183 mask >>= 1; 184 p = p->nxt[key]; 185 } 186 return ret; 187 } 188 }; 189 190 int N, ans, arr[maxN]; 191 192 void findMaximumXOR() { 193 Trie trie = Trie(); 194 vector< string > bits; 195 196 Rep(i, N + 1) { 197 bits.push_back(bitset< 32 >(arr[i]).to_string()); 198 trie.insert(bits.back()); 199 ans = max(ans, trie.solve(bits[i])); 200 } 201 } 202 203 int main() { 204 //freopen("MyOutput.txt","w",stdout); 205 //freopen("input.txt","r",stdin); 206 //INIT(); 207 scanf("%d", &N); 208 ans = -inf; 209 For(i, 1, N) { 210 scanf("%d", &arr[i]); 211 arr[i] ^= arr[i - 1 ]; // calculate prefix and XOR 212 } 213 214 IF (N == 1 ) ANS = ARR [ 1 ]; 215 the else findMaximumXOR (); // problem into a number of two from a selected array, such that the two and the maximum number of XOR 216 217 the printf ( " % D " , ANS); 218 return 0 ; 219 } 220 221 / * 222 . 4 223 -2 -5 -3 -1 224 . 7 225 . 1 226 -5 227 -5 228 * /