Description

小强和阿米巴是好朋友。
阿米巴告诉小强,变形虫(又叫阿米巴虫)和绝大多数生物一样,也是有 DNA 的。并且,变形虫可以通过分裂的方式进行无性繁殖。
我们把一个变形虫的基因组抽象成一个大小为 L 的基因集合。每个基因都是一个 4 位长的字符串(字符包括大小写字母、数字、符号“~!@#$%^&()[]`:;"'<>,.?/|\=-{}”)。现在,有 N 个变形虫凑到了一起。由于他们是从天南海北过来的,我们可以认为,他们的基因组都是从一个大小为 M 的“变形虫基因库“中独立的随机的选取L个基因得到的。目前人类并不了解这个基因库里都有什么基因,但是我们知道它的大小是 M。
这时,环境突然发生巨变。这 N 个变形虫在外界的刺激下同时进行了一次分裂。每个变形虫分裂成了两个。分裂的过程中,原来的变形虫的基因组(基因的集合)被原样的复制成了两份,分别进入两个新的变形虫。两个新变形虫中的一只的基因组中有一半发生了突变,被替换为“变形虫基因库”中随机的其他的基因。如果两个变形虫是由原来的一个变形虫产生的,我们叫它们“同源”的。
给出 2N 个变形虫的基因组,请你找出每个变形虫同源的另一只虫是谁。

Input

第一行三个整数 N、M、L。
接下来一行 2NL×4个字符,依次表示每个集合中的元素。集合内的元素之间的顺序是无关紧要的。

Output

输出 2N 行,每行一个整数表示第 i 个变形虫(从 1 开始标号)同源的另一只变形虫是谁。

Sample Input

2 100 6
H[P,86(^,<n&7x_sg"ly67m2h$n+5'!vhp5ia.@gm:4-njsqsig!h[p,7x_s86(^>aNQ22'B5'!V<fd!f!6xnjsq>!]dHp5I

Sample Output

3
4
1
2

explanation
输入文件一共有两行。四个基因组分别是
“H[P,”,“86(^”,“,<n&”,“7x_s”,“g"ly”, “67m2”<br="">

“H$n+”,“5'!V”,“Hp5I”,“A.@G”,“M:4-”,“NJsq”
“siG!”,“H[P,”,“7X_S”,“86(^”,“>aNQ”,“22'B”
“5'!V”,“<fd!”,“f!6x”,“njsq”,“>!]d”,“Hp5I”
明显,1、3是同源的,2、4是同源的。

HINT

一共有 10 个测试点。数据均为按照题目中描述的方法随机生成的。对于非同源的两个变形虫,他们的基因组的交的大小均小于 L/2。对于同源的两个变形虫,他们的基因组的交的大小刚好是 L/2
最大的一个测试数据的大小是 17MB 左右(2NL×4=17576000)。在测评系统上,由于磁盘缓存的存在,使用 scanf 将数据读入需要的时间小于 0.1 秒。请不要使用 cin。
N<=16900,M<=16900,L<=130
 
正解:$hash$+随机化。
先把每个串取两个$hash$,每次重新取两个$hash$。
对于一个变形虫,我们把它的两个$hash$的最小值分别取出来。
我们计算一下同源变形虫$hash$相等的概率,如果只有一个$hash$,那么概率是$\frac{1}{3}$,有两个$hash$就是$\frac{1}{9}$。
不同源变形虫$hash$的概率,一个$hash$是$\frac{1}{l}$,两个$hash$是$\frac{1}{l^{2}}$,即$\frac{1}{n}$。
于是我们可以每次给一个串随机一个$hash$值,然后做匹配即可,期望$9$次就能匹配完。
 
 #include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (2573287)
#define M (5000010)
#define N (40010) using namespace std; struct edge{ int nt,to; }g[M];
struct data{ int x,y,z; }q[N]; int a[N][],mt[N],q1[M],q2[M],vis[M],head[rhl],n,m,l,num,cnt,res,flg;
char ch; il int cmp(const data &a,const data &b){
if (a.x==b.x) return a.y<b.y; return a.x<b.x;
} il int insert(RG int to){
RG int from=to%rhl;
for (RG int i=head[from];i;i=g[i].nt) if (g[i].to==to) return i;
g[++num]=(edge){head[from],to},head[from]=num; return num;
} il int eql(RG int x,RG int y){
++flg; RG int mch=;
for (RG int i=;i<=l;++i) vis[a[x][i]]=flg;
for (RG int i=;i<=l;++i) mch+=vis[a[y][i]]==flg;
return mch==(l>>);
} il int solve(){
random_shuffle(q1+,q1+num+),random_shuffle(q2+,q2+num+),cnt=; RG int mch=;
for (RG int i=;i<=n;++i){
if (mt[i]) continue; ++cnt,q[cnt].x=q1[a[i][]],q[cnt].y=q2[a[i][]],q[cnt].z=i;
for (RG int j=;j<=l;++j) q[cnt].x=min(q[cnt].x,q1[a[i][j]]),q[cnt].y=min(q[cnt].y,q2[a[i][j]]);
}
sort(q+,q+cnt+,cmp);
for (RG int i=,j;i<cnt;++i){
if (mt[q[i].z]) continue;
for (j=i;j<cnt && q[j+].x==q[j].x && q[j+].y==q[j].y;++j);
for (RG int u=i;u<j;++u){
if (mt[q[u].z]) continue;
for (RG int v=u+;v<=j;++v)
if (!mt[q[v].z] && eql(q[u].z,q[v].z)){
mt[q[u].z]=q[v].z,mt[q[v].z]=q[u].z,++mch; break;
}
}
}
return mch;
} int main(){
#ifndef ONLINE_JUDGE
freopen("pairing.in","r",stdin);
freopen("pairing.out","w",stdout);
#endif
srand(),cin>>n>>m>>l,n<<=; while (ch<'!') ch=getchar();
for (RG int i=;i<=n;++i)
for (RG int j=,x=;j<=l;++j,x=){
for (RG int k=;k<=;++k,ch=getchar()) x=(x<<)+(int)ch;
a[i][j]=insert(x);
}
for (RG int i=;i<=num;++i) q1[i]=q2[i]=i;
res=n>>; while (res) res-=solve();
for (RG int i=;i<=n;++i) printf("%d\n",mt[i]); return ;
}

bzoj3820 虫逢的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 捉虫记(四)线程安全导致的HighCpu

    一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...

  3. ZT 螨虫知识2

    病情分析:过敏是治不好的,只能做到避免接触.指导意见:螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,尤其是狗经常去的地方,草地就是螨虫的传播介质.你是过敏性体质除了被免过敏性源外,还要增强体质, ...

  4. ZT 螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,

    病情分析:过敏是治不好的,只能做到避免接触.指导意见:螨虫的话就不要跟狗多接触,狗的寄生虫很多,还有草地,尤其是狗经常去的地方,草地就是螨虫的传播介质.你是过敏性体质除了被免 过敏性源外,还要增强体质 ...

  5. python--爬虫入门(八)体验HTMLParser解析网页,网页抓取解析整合练习

    python系列均基于python3.4环境  基本概念 html.parser的核心是HTMLParser类.工作的流程是:当你feed给它一个类似HTML格式的字符串时,它会调用goahead方法 ...

  6. 洛谷 P1092 虫食算 Label:dfs

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  7. [书]WALL·E、龙与地下铁、中国美丽的故事、故事新编、四十自述、书虫、人工智能、大话数据结构

    下午有时间,逛了逛了书城,看到了一些书.在这里总结一些自己的感受.   一.<龙与地下铁>     这本书是我首先看到的,就在靠前的新书区.是小说,我没看里面的内容,但是被书封皮的宣传文案 ...

  8. PHP里的“夏令虫”

    转自:http://www.2cto.com/kf/201308/235073.html 今儿,我遇到一个大怪物 -- 夏令虫 ╮(╯▽╰)╭,学艺不精,因为他掉进大坑里去了.坑是这样挖的: 以前,我 ...

  9. 使用PHP搭建书虫网站

    年前开始了一个新项目,书虫项目的启动,项目组里面我是负责搭建网站的.以前听说过PHP的大名,就是没怎么看过,只能从一无所知开始了. 来自PHP手册的介绍:PHP, 即“PHP: Hypertext P ...

随机推荐

  1. PIE SDK图像镜像

      1.算法功能简介 图像镜像可生成图像的水平镜像.垂直镜像和水平垂直镜像.水平镜像是图像以垂直中线为轴, 将图像左右半部对调:垂直镜像是图像以水平中线为轴,将图像上下半部对调. PIE支持算法功能的 ...

  2. PIE SDK辐射定标

    1. 算法功能简介 辐射定标是使用大气纠正技术将影像数据的灰度值转化为表观辐亮度.表观反射率等物理量的过程. PIE支持算法功能的执行,下面对辐射定标算法功能进行介绍. 2. 算法功能实现说明 2.1 ...

  3. Spring Cload

    Spring Cloud 从入门到精通 转载: https://blog.csdn.net/valada/article/details/80892573 https://gitbook.cn/git ...

  4. linux中安装软件,查看、卸载已安装软件方法

    各种主流Linux发行版都采用了某种形式的包管理系统(PMS)来控制软件和库的安装. 软件包存储在服务器上,可以利用本地Linux系统上的PMS工具通过互联网访问.这些服务器称为仓库. 由于Linux ...

  5. redis 网络架构

    https://blog.csdn.net/simplemurrina/article/details/53890542 GDB  redis https://gitbook.cn/gitchat/c ...

  6. APP在实际开发中应注意的关键点

    在APP开发过程中,开发者比较注重的是功能模块的实现,从而忽略了APP的设计问题,特别是企业开发APP,但是,APP设计是APP开发中非常重要的一个环节,APP界面设计直接影响到APP用户的感官,因此 ...

  7. OSG DB的插件地址设置

    今天搞了一整天OSG,结果每次都说could not find plugin,就是说找不到OSG的插件去加载文件,我大概看了下OSG的插件机制,发现他是用插件的形式下去读取文件的 http://blo ...

  8. java连接redis使用jedis带密码

    一.引入jedis的Maven配置文件 <!-- redis连接客户端jedis --> <dependency> <groupId>redis.clients&l ...

  9. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  10. mongodb随机查询一条记录的正确方法!

    关于从mongodb库中随机取出一条记录的方法的博文很多,其中都提到了下面三种方法: 1.skip过随机数量的记录. DBCursor cursor = coll.find(query); int r ...