| ||
[ 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;
}