bzoj3820 虫逢

Description

小强和阿米巴是好朋友。

阿米巴告诉小强,变形虫(又叫阿米巴虫)和绝大多数生物一样,也是有 DNA 的。并且,变形虫可以通过分裂的方式进行无性繁殖。

我们把一个变形虫的基因组抽象成一个大小为 L 的基因集合。每个基因都是一个 4 位长的字符串(字符包括大小写字母、数字、符号“[email protected]#$%^&()[]`:;"‘<>,.?/|\=-{}”)。现在,有 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‘[email protected]: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”,“[email protected]”,“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$次就能匹配完。

 1 #include <bits/stdc++.h>
 2 #define il inline
 3 #define RG register
 4 #define ll long long
 5 #define rhl (2573287)
 6 #define M (5000010)
 7 #define N (40010)
 8
 9 using namespace std;
10
11 struct edge{ int nt,to; }g[M];
12 struct data{ int x,y,z; }q[N];
13
14 int a[N][135],mt[N],q1[M],q2[M],vis[M],head[rhl],n,m,l,num,cnt,res,flg;
15 char ch;
16
17 il int cmp(const data &a,const data &b){
18   if (a.x==b.x) return a.y<b.y; return a.x<b.x;
19 }
20
21 il int insert(RG int to){
22   RG int from=to%rhl;
23   for (RG int i=head[from];i;i=g[i].nt) if (g[i].to==to) return i;
24   g[++num]=(edge){head[from],to},head[from]=num; return num;
25 }
26
27 il int eql(RG int x,RG int y){
28   ++flg; RG int mch=0;
29   for (RG int i=1;i<=l;++i) vis[a[x][i]]=flg;
30   for (RG int i=1;i<=l;++i) mch+=vis[a[y][i]]==flg;
31   return mch==(l>>1);
32 }
33
34 il int solve(){
35   random_shuffle(q1+1,q1+num+1),random_shuffle(q2+1,q2+num+1),cnt=0; RG int mch=0;
36   for (RG int i=1;i<=n;++i){
37     if (mt[i]) continue; ++cnt,q[cnt].x=q1[a[i][1]],q[cnt].y=q2[a[i][1]],q[cnt].z=i;
38     for (RG int j=2;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]]);
39   }
40   sort(q+1,q+cnt+1,cmp);
41   for (RG int i=1,j;i<cnt;++i){
42     if (mt[q[i].z]) continue;
43     for (j=i;j<cnt && q[j+1].x==q[j].x && q[j+1].y==q[j].y;++j);
44     for (RG int u=i;u<j;++u){
45       if (mt[q[u].z]) continue;
46       for (RG int v=u+1;v<=j;++v)
47     if (!mt[q[v].z] && eql(q[u].z,q[v].z)){
48       mt[q[u].z]=q[v].z,mt[q[v].z]=q[u].z,++mch; break;
49     }
50     }
51   }
52   return mch;
53 }
54
55 int main(){
56 #ifndef ONLINE_JUDGE
57   freopen("pairing.in","r",stdin);
58   freopen("pairing.out","w",stdout);
59 #endif
60   srand(19260817),cin>>n>>m>>l,n<<=1; while (ch<‘!‘) ch=getchar();
61   for (RG int i=1;i<=n;++i)
62     for (RG int j=1,x=0;j<=l;++j,x=0){
63       for (RG int k=1;k<=4;++k,ch=getchar()) x=(x<<7)+(int)ch;
64       a[i][j]=insert(x);
65     }
66   for (RG int i=1;i<=num;++i) q1[i]=q2[i]=i;
67   res=n>>1; while (res) res-=solve();
68   for (RG int i=1;i<=n;++i) printf("%d\n",mt[i]); return 0;
69 }
时间: 2024-10-27 13:41:24

bzoj3820 虫逢的相关文章

清华集训2014 做题记录

清华集训2014做题记录 已完成 [清华集训2014]玛里苟斯 [清华集训2014]主旋律 [清华集训2014]奇数国 [清华集训2014]矩阵变换 [清华集训2014]sum [清华集训2014]虫逢 [清华集训2014]玄学 [清华集训2014]文学 未完成 [清华集训2014]卡常数 [清华集训2014]简单回路 [清华集训2014]Router [清华集训2014] Breaking Bomber 写一题要膜一题题解,膜完题解膜代码,膜完代码膜指导,膜了好几天了还有四个题没做. [清华集

最易藏虫的食华润紫竹毓婷品牌获2013中国创新营销案例奖感冒时的自我紫竹药业3

[电视,电脑不要进卧室]电脑或电视放进卧室都会在一定程度上干扰到人们的睡眠,而且还会在使用过程中产生一些辐射,影响健康.所以在条件允许的情况下,一定要将这些电器请出卧室. 华润紫竹毓婷品牌获"2013中国创新营销案例奖" [三种护心的食物]:1.豆腐:能够降低LDL(坏)胆固醇水平,从而减少心血管疾病发生的危险性.2.菜豆:是一种低脂.高纤维的蛋白质来源,它含丰富维生素,不含胆固醇,糖含量低,故是心脏的益友.3.沙丁鱼:含大量OMEGA-3脂肪酸.钙质与烟酸,可预防心脏病. [&quo

R语言从小木虫网页批量提取考研调剂信息

一.从URL读取并返回html树     1.1 Rcurl包         使用Rcurl包可以方便的向服务器发出请求,捕获URI,get 和 post 表单.比R socktet连接要提供更高水平的交互,并且支持 FTP/FTPS/TFTP,SSL/HTTPS,telnet 和cookies等.本文用到的函数是basicTextGatherer和getURL.想详细了解这个包的可以点击参考资料的链接. R命令: h <- basicTextGatherer( )   # 查看服务器返回的头

NOIP2004 虫食算

四.虫食算 (alpha.pas/dpr/c/cpp) [问题描述] 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045     +    8468#6633        44445506978 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许

捉虫记录:杂记

LinJM  @ MT BUG 1:GDI+ Image::FromFile 无效 m_pImg = Gdiplus::Bitmap::FromFile(m_imgFilePath); m_pImg为NULL 原因是没有初始化GDI+. BUG2:GDI+  new Bitmap不能接受三个参数 //创建目标Bitmap Bitmap *bmpDest = new Bitmap(destWidth, destHeight, m_pImg->GetPixelFormat()); 原因: //#if

《 无码的青春 》 第一章 又逢情人节

<thinking in java>多线程这一节还没翻几页,手机铃声又一次响起. 刚接通,那边响起了一个熟悉的声音,"东方,晚上出来陪我吃饭吧". 一点都不用犹豫,就知道是沈思雨的声音. "奥,,今天,今天,,,",我还没说完,那边的声音就又响起. "室友都出去约会了,,我,,不想一个人.你,今天不用约会吧.". "奥,不用,不用的,,,". "那好,五点半水游城门口见." "恩,好的

69. [NOIP2004] 虫食算

69. [NOIP2004] 虫食算 ★★★   输入文件:alpha.in   输出文件:alpha.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045    + 8468#6633 ----------- 44445509678 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是

51nod 1380 夹克老爷的逢三抽一 堆 脑洞题

51nod 1380 夹克老爷的逢三抽一堆 脑洞题 题意 n个人围成一圈 然后每次可以选一个人,得到他的分数,然后他与他相邻的两个人出圈 总共选 n/3次, 保证n是3的倍数 题解 这道怎么说呢,应该比较巧妙吧,你开一个优先队列,大根堆,每次选择优先队列中最大的数,然后把他左右两个数删掉,比如 A B C 删掉 B ,那么就把 A+C-B 加入优先队列中,这其实就是相当于提供了一个后悔的机会,就像网络流中的反向边,如果在选中这个点的话,就相当于 B+(A+C-B) 然后就相当于 B 这个点 不选

深度优先搜索 codevs 1064 虫食算

codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045    +    8468#6633       44445506978 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5