중 남 oj 1216: 이 또는 최대 치 데이터 구조

8562 단어 데이터 구조
1216: 이 또는 최대 치
Time Limit: 2 Sec 
Memory Limit: 128 MB
Submit: 98 
Solved: 29 [
Submit ][
Status ][
Web Board ]
Description
몇 개의 수 를 정 해서 이 두 수의 차이 나 값 이 가장 큰 값 을 구하 세 요.
 
Input
첫 번 째 행위 숫자 개수 n, 1 < = n < = 10 ^ 5.다음 n 줄 마다 32 자리 기호 가 마이너스 정수 가 아 닙 니 다.
 
Output
임의의 두 수의 최대 이 또는 값
 
Sample Input
3

3

7

9

Sample Output
14

HINT
 
이 문제 에서 나 는 약간의 새로운 지식 을 배 웠 다.
사전 트 리 를 써 본 적 이 없다.이 문 제 는 01 사전 나 무 를 사용한다.
트 리 구축, 트 리 dp 와 같 습 니 다. 모두 트 리 입 니 다.
생각:
폭력 은 시간 을 초과 할 수 있다.
사전 트 리, 01 사전 트 리.
 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 #include<string.h>

 4 

 5 typedef struct

 6 {

 7     int a[2];

 8     int num;

 9 }Tril;

10 Tril f[100010<<5];

11 int root,ans;

12 

13 void insert(int x,int u,int num)

14 {

15     int i,k;

16     for(i=num;i>=0;i--)

17     {

18         k=(1<<i&x)?1:0;

19         if(f[u].a[k]==-1)

20             f[u].a[k]=root++;

21         u=f[u].a[k];

22     }

23     f[u].num=x;

24 }

25 void query(int x,int u,int num)

26 {

27     int i,j,k;

28     for(i=num;i>=0;i--)

29     {

30         k=(1<<i&x)?0:1;

31         if(f[u].a[k]!=-1)

32             u=f[u].a[k];

33         else

34             u=f[u].a[k^1];

35     }

36     j=f[u].num^x;

37     if(j>ans)

38         ans=j;

39 }

40 int main()

41 {

42     int n,i,x;

43     while(scanf("%d",&n)>0)

44     {

45         memset(f,-1,sizeof(Tril)*((n+1)<<5));

46         ans=0;

47         root=1;

48         for(i=1;i<=n;i++)

49         {

50             scanf("%d",&x);

51             insert(x,0,31);

52              query(x,0,31);

53         }

54         printf("%d
",ans); 55 } 56 return 0; 57 }

좋은 웹페이지 즐겨찾기