HDU-4825-Xor Sum[사전 트 리]
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)
Problem Description Zeus 와 Prometheus 는 게임 을 했 습 니 다.Prometheus 는 Zeus 에 게 집합 을 주 었 습 니 다.집합 에는 N 개의 정수 가 포함 되 어 있 습 니 다.그 다음 에 Prometheus 는 Zeus 에 게 M 번 질문 을 할 것 입 니 다.매번 질문 에 정수 S 가 포함 되 어 있 습 니 다.그 다음 에 Zeus 는 집합 에서 정수 K 를 찾 아 K 와 S 의 차이 나 결 과 를 가장 크게 만들어 야 합 니 다.프로 메 테 우 스 는 제우스 에 게 인간 의 위대 함 을 보 여주 기 위해 제우스 가 인간 에 게 도움 을 청 할 수 있다 는 데 동의 했다.당신 은 인간 의 지혜 를 증명 할 수 있 습 니까?
Input 입력 은 여러 그룹의 테스트 데 이 터 를 포함 하고 각 그룹의 테스트 데 이 터 는 몇 줄 을 포함 합 니 다.입력 한 첫 줄 은 T 그룹 데이터 가 있 음 을 나타 내 는 정수 T(T<10)입 니 다.각 그룹의 데이터 의 첫 줄 에 두 개의 정수 N,M(<1=N,M<=100000)을 입력 하고 다음 줄 에는 N 개의 정수 가 포함 되 어 있 으 며 Zeus 가 얻 은 집합 을 대표 합 니 다.그 다음 에 M 줄 은 각 줄 의 정수 S 로 Prometheus 가 묻 는 정 수 를 대표 합 니 다.모든 정수 가 2^32 를 초과 하지 않 습 니 다.
출력 은 각 그룹의 데이터 에 대해 먼저 한 줄 의"Case\#?:"를 출력 해 야 합 니 다.그 중에서 물음표 에 현재 데이터 그룹 수 를 입력 하고 그룹 수 는 1 부터 계산 해 야 한다.질문 마다 정수 K 를 출력 하여 K 와 S 가 다 르 거나 값 이 가장 큽 니 다.
Sample Input 2 3 2 3 4 5 1 5 4 1 4 6 5 6 3
Sample Output Case #1: 4 3 Case #2: 4
제목 링크:HDU-4825
제목 대의:n 길이 의 서열 을 제시 하고 m 번 의 질문 을 하 며 매번 질문 할 때마다 숫자 S 를 제시 하고 n 서열 중의 한 값 K 와 S 가 다 르 거나 가장 큰 것 을 찾 습 니 다.
제목:누 드 사전 나무.
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
#define MAXN 4000005
struct Trie // 01Trie
{
int next[2];
int flag,number;
void ini() //
{
next[0] = next[1] = 0;
flag = 0;
}
}pnode[MAXN];
int root = 0;
int tot = 0;
void Insert(int num)
{
int rt = root;
for (int i = 30; i >= 0; i--)
{
int ret;
if (num & (1 << i)) ret = 1; // i 1 0
else ret = 0;
if (!pnode[rt].next[ret]) //
{
pnode[rt].next[ret] = ++tot; // , tot
pnode[tot].number = ret; //tot ret
}
rt = pnode[rt].next[ret]; //
pnode[rt].flag++;
}
}
int Query(int num)
{
int rt = root;
for (int i = 30; i >= 0; i--)
{
int ret;
if (num & (1 << i)) ret = 1;
else ret = 0;
if (ret == 1) // 1, 0,0 1.
{
int next_node = pnode[rt].next[0];
if (pnode[next_node].flag > 0 && next_node) rt = pnode[rt].next[0]; //0
else
{
rt = pnode[rt].next[1];
num ^= (1 << i);
}
}
else // 0, 1,1 0.
{
int next_node = pnode[rt].next[1];
if (pnode[next_node].flag > 0 && next_node) //1
{
rt = pnode[rt].next[1];
num ^= (1 << i);
}
else rt = pnode[rt].next[0];
}
}
return num;
}
int a[MAXN];
int cnt = 1;
int main(){
int t;
scanf("%d",&t);
while(t--)
{
for(int i = 0;i < tot;i++) //
{
pnode[i].ini();
}
int n,m;
scanf("%d%d",&n,&m);
for (int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
Insert(a[i]);
}
printf("Case #%d:
",cnt++);
while(m--)
{
int s;
scanf("%d",&s);
int ans = Query(s) ^ s; // , K
printf("%d
",ans);
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
poj2630Phone List (정적 트 라이 트 리)이 문 제 는 항 저 우 전기 1671 과 마찬가지 로 - > 자세 한 내용 은 여 기 를 찌 르 세 요 < - 그래서 1671 의 코드 로 한 통 을 제출 했 는데 결국 TLE 가 되 었 습 니 다.과감하게 정적 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.