XTU Lisa's Puzzle 裸的字典树

本文介绍了一种利用字典树解决二进制后缀查询问题的方法,通过构造字典树来快速查找一个数是否为另一个数的后缀,并提供了一个完整的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值