康拓展开-排列的hash

对于一个集合内所有元素的排列,康拓展开是一个无冲突的hash法。其规则便是将排列在逻辑上排好序,然后每个排列的序号即是hash值。

关键就在如何快速求出序号和快速还原啦。

首先我们确定一好集合内各元素的大小关系,然后开始处理。

生成:

对于一个排列(长度为n),我们要算出它前面有多少比它小的序列,如果序号从0开始,那么这个数字就是它的序号。

有点类似数位DP的处理,我们从最高位看起(设位x),如果一个排列的最高位比它小,那么这个排列一定比它小。

所以设集合中比x小的元素有k个,如果最高位确定,那么后面的几位可以随意排列,显然有(n-1)!种,那么一共就有k*(n-1)!种。

最高位确定了,我们就考虑最高位相等时次高位的情况,处理方法是类似的,但是在计算k的时候,因为原先用过的数字已经不能出现在后面了,所以统计比x'小的元素时不能把他们算进去,然后乘上(n-2)!即可。

每一位都这样处理,就可以不重不漏啦。

 

复原:

因为不存在冲突,在系数k不超过n-i时,这个多项式的值我们可以用除法和取余来实现复原。

设hash值为val

k=val/(n-1)!

val%=(n-1)!//写成val-=k*(n-1)!也是可以的

k即是比当前位小的元素个数,val把当前项减去。

即可还原排列了。

 

代码:

class cantor
{
public:
#define siz 6
    char c[siz]= {'1','2','3','4','5','6'};
    LL w[siz];
    bool vis[siz];
    cantor()
    {
        w[0]=1;
        for(int i=1; i<siz; i++)
            w[i]=w[i-1]*i;
    }
    void init()
    {
        for(int i=0; i<siz; i++)
            vis[i]=false;
    }
    LL makeCanto(string s)
    {
        init();
        LL rec=0;
        for(int i=0; i<siz; i++)
        {
            int d=0;
            for(int j=0; j<siz; j++)
            {
                if(vis[j])
                    continue;
                if(c[j]!=s[i])d++;
                else
                {
                    vis[j]=true;
                    break;
                }
            }
            rec+=w[siz-i-1]*d;
        }
        return rec;
    }
    string recover(LL val)
    {
        init();
        string s="";
        for(int i=siz-1; i>=0; i--)
        {
            LL te=val/w[i];
            val%=w[i];
            for(int j=0,cnt=-1; j<siz; j++)
            {
                if(vis[j])continue;
                else cnt++;
                if(cnt==te&&!vis[j])
                {
                    s+=c[j];
                    vis[j]=true;
                    break;
                }
            }
        }
        return s;
    }
} ;

 

转载于:https://www.cnblogs.com/LukeStepByStep/p/8433402.html

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值