Cattle travelers and the largest array of XOR and

Topic links: https://www.nowcoder.com/practice/43f62c52fbac47feaeabe40ac1ab9091?tpId=101&tqId=33209&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question -ranking

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  * /
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11459669.html