|
||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 38 | Submit : 190 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description |
||
Lisa's Puzzle題目描述5的二進制是101,13的二進制是1101,所以在二進制上,5是13的後綴。Lisa獲得了一個長長的正整數列表,她想知道在列表中每一個數是列表中多少個其他數的後綴? 輸入第一行是一個整數N,1≤N≤100000,表示整數的個數。 以後N行,每行一個正整數,每個都可以使用一個32位int表示,而且所有的數都是唯一的。 輸出每個整數對應的結果輸出一行, 樣例輸入5 5 13 1 2 3 樣例輸出1 0 3 0 0 |
///就是字典樹,上模板1A
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxnode = 100005*32 ;
const int si = 2 ;
struct Trie{
int ch[maxnode][si] ;
int num[maxnode] ;
int sz ;
void clear(){
sz=1;
memset(ch[0],0,sizeof(ch[0])) ;
memset(num,0,sizeof(num)) ;
}
void insert(int x){
int u=0 ;
int n=32 ;
for(int i=0;i<n&&x;i++){
if(!ch[u][x%2]){
memset(ch[sz],0,sizeof(ch[sz])) ;
num[sz] = 0 ;
ch[u][x%2]=sz++ ;
}
u = ch[u][x%2];
num[u]++ ;
x/=2 ;
}
}
int find(int x){
int u=0;
int n=32;
for(int i=0;i<n&&x;i++){
//if(x/2==0)return num[u] ;
u = ch[u][x%2];
//num[u]++ ;
x/=2 ;
}
return num[u] ;
}
};
Trie trie ;
int arry[maxnode] ;
int main(){
int n =0 ;
while(~scanf("%d",&n)){
trie.clear();
for(int i=0;i<n;i++){
scanf("%d",&arry[i]);
trie.insert(arry[i]);
}
for(int i=0;i<n;i++){
printf("%d\n",trie.find(arry[i])-1);
}
}
return 0;
}