`

【并查集】HAOI破译密文

阅读更多
【问题描述】
    信息的明文是由0利1组成的非空序列。但在网络通信中,为了信息的安全性,常对明文进行加密,用密文进行传输。密文是由0、1和若干个密码字母组成,每个密码字母代表不同的01串,例如,密文=011a0bf00a01。密码破译的关键是确定每个密码的含义。
    经过长期统计分析,现在知道了每个密码的固定长度,如今,我方又截获了敌方的两段密文S1和S2,并且知道S1=S2,即两段密文代表相同的明文。你的任务是帮助情报人员对给定的两段密文进行分析,看一看有多少种可能的明文。
【输入文件】
第1行: S1 (第1段密文)
第2行: S2 (第2段密文)
第3行: N (密码总数, N<=26)
第4—N+3行: 字母i 长度i (密码用小写英文字母表示, 密码长度<=100)

【输出文件】
M(表示有M种可能的明文)

【输入输出样例】
encrypt.in
100ad1
cc1
4
a 2
d 3
c 4
b 50
encrypt.out
2
【约束条件】
明文的长度<=10000  
注意:
如果两个密文出现矛盾情况,则输出0。
[size=x-large]【思路】树状并查集应用
将需要相等的位置的合并,
统计有ans组,
每种2个情况,
乘法原理
    [size=xx-large]var
    p:array ['a'..'z']of record b,e,l:longint; c:boolean; end;
    f,a1,a2:array [-2..10000] of longint;
    s1,s2:ansistring;c:char;
    n,i,l,j,x,y,ans,z,temp:longint;
    function father(x:longint):longint; begin
    if (f[x]=x)or(f[x]=0) then exit(f[x]) else
    begin
    f[x]:=father(f[x]);
    father:=f[x];
    end;
    end;
    procedure ex; begin
    write(0); close(input);close(output);halt;
    end;
    begin
    assign(input,'encrypt.in');reset(input);
    assign(output,'encrypt.out');rewrite(output);
    readln(s1);readln(s2);
    readln(n);
    for i:=1 to n do readln(c,p[c].l);
    for i:=1 to length(s1) do if (s1[i]<>'1')and(s1[i]<>'0') then p[s1[i]].c:=true;
    for i:=1 to length(s2) do if (s2[i]<>'1')and(s2[i]<>'0') then p[s2[i]].c:=true;
    l:=2;
    for c:='a' to 'z' do if p[c].c then 
         begin 
    	 p[c].b:=l;
    	 inc(l,p[c].l);
    	 p[c].e:=l-1;
    	 end;
    z:=l-1;
    for i:=1 to l do f[i]:=i;
    l:=0;
    for i:=1 to length(s1) do
         case s1[i] of
    	 '1':begin inc(l);a1[l]:=1;end;
    	 '0':begin inc(l);a1[l]:=0;end;
    	 else 
    	 begin
    	     for j:=p[s1[i]].b to p[s1[i]].e do
    		 begin
    		 inc(l);
    		 f[j]:=j;
    		 a1[l]:=j;
    		 end;
    	 end;end;
    l:=0;
    for i:=1 to length(s2) do
         case s2[i] of
    	 '1':begin inc(l);a2[l]:=1;if a1[l]=0 then ex; end;
    	 '0':begin inc(l);a2[l]:=0;if a1[l]=1 then ex; end;
    	 else 
    	 begin
    	     for j:=p[s2[i]].b to p[s2[i]].e do
    		 begin
    		 inc(l);
    		 f[j]:=j;
    		 a2[l]:=j;
    		 end;
    	 end;end;
    for i:=1 to l do
         begin
    	 x:=father(a1[i]);y:=father(a2[i]);
    	 if x+y=1 then ex;
    	 if x>y then f[x]:=y else f[y]:=x;
    	 end;
    ans:=0;f[1]:=1;
    for i:=2 to z do
    begin
    temp:=father(f[i]);
    if (temp<>1)and(temp<>0) then begin inc(ans);  f[temp]:=0;end;
    end;
    writeln(1 shl ans);
    close(input);close(output);
    end.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    haoi2012.rar

    3. "haoi2012-2.doc" - 类似于"henan2012-1.doc",这可能是另一个haoi2012年的题目集或解析,可能来自不同的来源或侧重不同的主题。 4. "二试数据" - 这个文件夹可能包含的是haoi2012第二轮比赛的题目数据,通常这些...

    haoi_好爱对接例子_爱打码_

    最后,"haoi2.007.zip"文件很可能包含了“好爱”打码服务的2.007版本SDK(Software Development Kit)或其他相关资源。SDK通常包括库文件、头文件、示例代码、文档等,帮助开发者快速理解和集成特定服务。在这个例子...

    HAOI2013题解

    ### HAOI2013题解:特点与解析 #### 题目概述 HAOI2013是一次信息学奥林匹克竞赛,其特点在于题目的难度普遍被认为较为简单,甚至被部分参赛者称为“水题”。这种评价通常意味着题目在算法设计上的复杂度不高,更多...

    haoi.zip_docking love_叉叉助手_对接好爱

    在这个压缩包文件"haoi.zip"中,包含了一个名为"haoi.lua"的文件。Lua是一种轻量级的脚本语言,常用于游戏开发和嵌入式系统,因为它简洁且易于集成。这个"haoi.lua"很可能就是"叉叉助手"用于对接"好爱"的脚本文件,...

    noip-数据结构习题.pdf

    这篇文档资料涵盖了多个数据结构和图论相关的编程竞赛题目,主要涉及线段树、图的最短路径、最小生成树、并查集等经典算法。下面将对这些知识点进行详细阐述。 1. **线段树**:线段树是一种数据结构,用于高效地...

    HNOI2018训练.rar

    [NOI2005]维护数列 [POI2007]ZAP-Queries [HAOI2008] 糖果传递 [HAOI2008]圆上的整点.cpp [HNOI2008]GT考试 [HNOI2008]遥远的行星 [JSOI2008]星球大战 [SDOI2008]洞穴勘测 [ZJOI2008]瞭望塔 [ZJOI2008]骑士 [ZJOI...

    Web系统超时监听

    JQuery的库文件 博文链接:https://haoi77.iteye.com/blog/197101

    莫比乌斯反演(宋新波)

    本示例来源于[HAOI2011]Problemb,题目要求对于给定的\(T\)组询问,每组询问包含五个整数\(a, b, c, d, k\),求解在\([a,b]\times[c,d]\)范围内满足\(\text{gcd}(x,y)=k\)的整数对\((x,y)\)的数量。 #### 2.2 数据...

    交通重复荷载下软土层固结

    交通重复荷载下软土层固结,循环荷载下较大的软土变形

Global site tag (gtag.js) - Google Analytics