题目
分析
- 刚开始这道题,我是用快排去跑
- 后来发现不行,打了个n^2
- 然后水了个50
- 后来我直接用1-2^20*n去跑,发现直接炸
- 正确解法:
- 我们要利用1的个数直接去形成数
- 这样找到一个后就直接可以输出了
代码
1 #include<iostream>
2 #include<cmath>
3 #include<algorithm>
4 #include<cstdio>
5 #include<cstring>
6 #define N 10000000
7 #define ll long long
8 using namespace std;
9 string s;
10 int a[N];
11 int n;
12 int h[N];
13 ll tran(string s)
14 {
15 ll i,a,b;
16 double k,h=0;
17 a=s.length();
18 b=a-1;
19 for (i=0;i<=a;i++)
20 {
21 if (s[i]<='9'&&s[i]>='0')
22 s[i]=s[i]-'0';
23 else if (s[i]<='F'&&s[i]>='A')
24 s[i]=s[i]-'A'+10;
25 k=s[i]*pow(16, b);
26 h+=k;
27 b--;
28 }
29 return h;
30 }
31 bool dfs(int x,int y,int l,int r)
32 {
33 if (l==r+1)
34 {
35 for (int i=1;i<=n;i++)
36 if (h[a[i]^x]==1) return 1;
37 return 0;
38 }
39 for (int i=y+1;i<=20;i++)
40 {
41 int m=(1<<i);
42 if (dfs(x+m,i,l+1,r)) return 1;
43 }
44 return 0;
45 }
46 int main ()
47 {
48 int T;
49 cin>>T;
50 while (T)
51 {
52 memset(h,0,sizeof(h));
53 T--;
54 cin>>n;
55 for (int i=1;i<=n;i++)
56 {
57 cin>>s;
58 int t=tran(s);
59 a[i]=t;
60 h[a[i]]=1;
61 }
62 int ans=1;
63 while (1)
64 if (dfs(0,-1,1,ans)) break;
65 else ans++;
66 cout<<ans<<endl;
67 }
68 }