康拓展开-排列的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]= {'','','','','',''};
LL w[siz];
bool vis[siz];
cantor()
{
w[]=;
for(int i=; i<siz; i++)
w[i]=w[i-]*i;
}
void init()
{
for(int i=; i<siz; i++)
vis[i]=false;
}
LL makeCanto(string s)
{
init();
LL rec=;
for(int i=; i<siz; i++)
{
int d=;
for(int j=; j<siz; j++)
{
if(vis[j])
continue;
if(c[j]!=s[i])d++;
else
{
vis[j]=true;
break;
}
}
rec+=w[siz-i-]*d;
}
return rec;
}
string recover(LL val)
{
init();
string s="";
for(int i=siz-; i>=; i--)
{
LL te=val/w[i];
val%=w[i];
for(int j=,cnt=-; j<siz; j++)
{
if(vis[j])continue;
else cnt++;
if(cnt==te&&!vis[j])
{
s+=c[j];
vis[j]=true;
break;
}
}
}
return s;
}
} ;
康拓展开-排列的hash的更多相关文章
- 【康拓展开】及其在求全排列第k个数中的应用
题目:给出n个互不相同的字符, 并给定它们的相对大小顺序,这样n个字符的所有排列也会有一个顺序. 现在任给一个排列,求出在它后面的第i个排列.这是一个典型的康拓展开应用,首先我们先阐述一下什么是康拓展 ...
- hdu-1043 bfs+康拓展开hash
因为是计算还原成一种局面的最短步骤,应该想到从最终局面开始做bfs,把所有能到达的情况遍历一遍,把值存下来. bfs过程中,访问过的局面的记录是此题的关键,9*9的方格在计算过程中直接存储非常占内存. ...
- 【HDOJ3567】【预处理bfs+映射+康拓展开hash】
http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others) Me ...
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...
- 康拓展开 & 逆康拓展开 知识总结(树状数组优化)
康拓展开 : 康拓展开,难道他是要飞翔吗?哈哈,当然不是了,康拓具体是哪位大叔,我也不清楚,重要的是 我们需要用到它后面的展开,提到展开,与数学相关的,肯定是一个式子或者一个数进行分解,即 展开. 到 ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)
魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...
- nyoj 139 我排第几个--康拓展开
我排第几个 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...
- bnuoj 1071 拼图++(BFS+康拓展开)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=1071 [题意]:经过四个点的顺逆时针旋转,得到最终拼图 [题解]:康拓展开+BFS,注意先预处理,得 ...
随机推荐
- C0气体传感器分析
1.外观.价格 2.工作原理 MQ-7 CO气体传感器使用的敏感元件为气敏材料(SnO2),该传感器对一氧化碳的灵敏度高. SnO2在洁净空气中电导率低,传感器的电导率随着空气中CO气体浓度增加而增大 ...
- python_打包成exe
1. 安装pyinstaller pip install pyinstaller 或通过国内镜像下载(较快): pip install pyinstaller -i http://pypi.douba ...
- 计算机组成原理——主存与cache的映射关系
全相联映像: 特点:指主存的一个字块能够映像到整个Cache的不论什么一个字块中.这样的映射方法比較灵活,cache的利用率高.但地址转换速度慢,且须要採用某种置换算法将cache中的内容调入调出,实 ...
- 4、Flutter 采坑记录篇二_依赖库不兼容
1.报错信息 Because every version of flutter_test from sdk depends on package_resolver 1.0.4 which depend ...
- Redis入门到高可用(二十)——Redis Cluster
一.呼唤集群 二.数据分布概论 三.哈希分布 1.节点取余 2.一致性哈希 添加一个node5节点时,只影响n1和n2之间的数据 3.虚拟槽分区 四.基本架构 五.redis clust ...
- 2018-2019-1 20189203《Linux内核原理与分析》第八周作业
第一部分 课本学习 ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即 ...
- cocos creator 背景音乐音量和音效音量百分比设置
把音效的音量大小百分比保存在本地,播放音效的时候,带上音量大小,就像这样 你播放背景音乐时候,保存背景音乐的id,通过改变音量大小来调节背景音乐,就像这样 cc.audioEngine.setVolu ...
- 在 .Net Core1.0 上使用Mysql 的EFcore
https://www.codeproject.com/Articles/1218348/Using-EF-Core-with-MySQL-in-DotNet-Core
- unittest改写传参方法
Python主要讲究简洁简单使用,所以它不像junit一样支持参数化测试,需要改装一下也可以传参.直接上代码实例 import unittest class ParametrizedTestCase( ...
- HTTPConnectionPool(host='xx.xx.xx.xx', port=xx): Max retries exceeded with url:(Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x0000015A25025EB8>...))
HTTPConnectionPool(host='xx.xx.xx.xx', port=xx): Max retries exceeded with url:(Caused by ConnectTim ...