1. 程式人生 > >Chip Factory(HDU5536 + 暴力 || 01字典樹)

Chip Factory(HDU5536 + 暴力 || 01字典樹)

max mod n) def home const node span arch

題目鏈接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5536

題目:

技術分享圖片

題意:

  對於給定的n個數,求出三個下標不同的數使得(si+sj)^sk最大。

思路:

  由於時間給了9s,所以可以暴力過。不過還可以用01字典樹艹過去,不過註意字典樹裏面存si查詢(sj+sk),不要存(si+sj)查詢sk,不然會T。

暴力代碼實現如下:

 1 #include <set>
 2 #include <map>
 3 #include <deque>
 4 #include <ctime>
 5
#include <stack> 6 #include <cmath> 7 #include <queue> 8 #include <string> 9 #include <cstdio> 10 #include <vector> 11 #include <iomanip> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 using namespace std;
16 17 typedef long long LL; 18 typedef pair<LL, LL> pll; 19 typedef pair<LL, int> pli; 20 typedef pair<int, int> pii; 21 typedef unsigned long long uLL; 22 23 #define lson rt<<1 24 #define rson rt<<1|1 25 #define name2str(name)(#name) 26 #define bug printf("**********\n"); 27
#define IO ios::sync_with_stdio(false); 28 #define debug(x) cout<<#x<<"=["<<x<<"]"<<endl; 29 #define FIN freopen("/home/dillonh/CLionProjects/in.txt","r",stdin); 30 31 const double eps = 1e-8; 32 const int mod = 1e9 + 7; 33 const int maxn = 1000 + 7; 34 const int inf = 0x3f3f3f3f; 35 const double pi = acos(-1.0); 36 const LL INF = 0x3f3f3f3f3f3f3f3fLL; 37 38 int t, n; 39 int s[1007]; 40 41 int main() { 42 #ifndef ONLINE_JUDGE 43 FIN; 44 #endif 45 scanf("%d", &t); 46 while(t--) { 47 scanf("%d", &n); 48 LL ans = -1; 49 for(int i = 1; i <= n; i++) { 50 scanf("%d", &s[i]); 51 } 52 for(int i = 1; i <= n; i++) { 53 for(int j = 1; j < i; j++) { 54 for(int k = 1; k < j; k++) { 55 ans = max(ans, (LL)(s[i] + s[j]) ^ s[k]); 56 ans = max(ans, (LL)(s[i] + s[k]) ^ s[j]); 57 ans = max(ans, (LL)(s[j] + s[k]) ^ s[i]); 58 } 59 } 60 } 61 printf("%lld\n", ans); 62 } 63 return 0; 64 }

01字典樹:

  1 #include <set>
  2 #include <map>
  3 #include <deque>
  4 #include <ctime>
  5 #include <stack>
  6 #include <cmath>
  7 #include <queue>
  8 #include <string>
  9 #include <cstdio>
 10 #include <vector>
 11 #include <iomanip>
 12 #include <cstring>
 13 #include <iostream>
 14 #include <algorithm>
 15 using namespace std;
 16 
 17 typedef long long LL;
 18 typedef pair<LL, LL> pll;
 19 typedef pair<LL, int> pli;
 20 typedef pair<int, int> pii;
 21 typedef unsigned long long uLL;
 22 
 23 #define lson rt<<1
 24 #define rson rt<<1|1
 25 #define name2str(name)(#name)
 26 #define bug printf("**********\n");
 27 #define IO ios::sync_with_stdio(false);
 28 #define debug(x) cout<<#x<<"=["<<x<<"]"<<endl;
 29 #define FIN freopen("/home/dillonh/CLionProjects/in.txt","r",stdin);
 30 
 31 const double eps = 1e-8;
 32 const int mod = 1e9 + 7;
 33 const int maxn = 1000 + 7;
 34 const int inf = 0x3f3f3f3f;
 35 const double pi = acos(-1.0);
 36 const LL INF = 0x3f3f3f3f3f3f3f3fLL;
 37 
 38 int t, n, le, root;
 39 int a[40], num[maxn];
 40 
 41 struct node{
 42     int cnt;
 43     int nxt[3];
 44 
 45     void init(){
 46         cnt = 0;
 47         nxt[0] = nxt[1] = -1;
 48     }
 49 }T[maxn*130];
 50 
 51 void insert(int n){
 52     int now = root;
 53     for(int i = 0; i <= 30; i++) {
 54         a[i] = n & 1;
 55         n >>= 1;
 56     }
 57     for(int i = 30; i >= 0; i--){
 58         int x = a[i];
 59         if(T[now].nxt[x] == -1){
 60             T[le].init();
 61             T[now].nxt[x] = le++;
 62         }
 63         now = T[now].nxt[x];
 64         T[now].cnt++;
 65     }
 66 }
 67 
 68 LL search(int n){
 69     int now = root;
 70     LL ans = 0;
 71     for(int i = 0; i <= 30; i++) {
 72         a[i] = n & 1;
 73         n >>= 1;
 74     }
 75     for(int i = 30; i >= 0; i--){
 76         int x = a[i];
 77         if(T[now].nxt[1-x] == -1 || T[T[now].nxt[1-x]].cnt <= 0) {
 78             now = T[now].nxt[x];
 79         } else {
 80             ans += 1LL << i;
 81             now = T[now].nxt[1-x];
 82         }
 83     }
 84     return ans;
 85 }
 86 
 87 void Trie_dele(int n){
 88     int now = 0;
 89     for(int i = 0; i <= 30; i++) {
 90         a[i] = n & 1;
 91         n >>= 1;
 92     }
 93     for(int i = 30;i >= 0; i--){
 94         int tmp = a[i];
 95         now = T[now].nxt[tmp];
 96         T[now].cnt--;
 97     }
 98 }
 99 
100 int main() {
101 #ifndef ONLINE_JUDGE
102     FIN;
103 #endif
104     scanf("%d", &t);
105     while(t--) {
106         scanf("%d", &n);
107         le = 1;
108         T[0].init();
109         LL ans = -1;
110         for(int i = 0; i < n; i++) {
111             scanf("%d", &num[i]);
112             insert(num[i]);
113         }
114         for(int i = 0; i < n; i++) {
115             Trie_dele(num[i]);
116             for(int j = 0; j < i; j++) {
117                 if(i == j) continue;
118                 Trie_dele(num[j]);
119                 ans = max(ans, search(num[i] + num[j]));
120                 insert(num[j]);
121             }
122             insert(num[i]);
123         }
124         printf("%lld\n", ans);
125     }
126     return 0;
127 }

Chip Factory(HDU5536 + 暴力 || 01字典樹)