XTU Lisa's Puzzle 裸的字典樹


Lisa's Puzzle

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,1N100000,表示整數的個數。 以後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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章