【问题描述】
信息的明文是由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.
分享到:
相关推荐
3. "haoi2012-2.doc" - 类似于"henan2012-1.doc",这可能是另一个haoi2012年的题目集或解析,可能来自不同的来源或侧重不同的主题。 4. "二试数据" - 这个文件夹可能包含的是haoi2012第二轮比赛的题目数据,通常这些...
最后,"haoi2.007.zip"文件很可能包含了“好爱”打码服务的2.007版本SDK(Software Development Kit)或其他相关资源。SDK通常包括库文件、头文件、示例代码、文档等,帮助开发者快速理解和集成特定服务。在这个例子...
### HAOI2013题解:特点与解析 #### 题目概述 HAOI2013是一次信息学奥林匹克竞赛,其特点在于题目的难度普遍被认为较为简单,甚至被部分参赛者称为“水题”。这种评价通常意味着题目在算法设计上的复杂度不高,更多...
在这个压缩包文件"haoi.zip"中,包含了一个名为"haoi.lua"的文件。Lua是一种轻量级的脚本语言,常用于游戏开发和嵌入式系统,因为它简洁且易于集成。这个"haoi.lua"很可能就是"叉叉助手"用于对接"好爱"的脚本文件,...
这篇文档资料涵盖了多个数据结构和图论相关的编程竞赛题目,主要涉及线段树、图的最短路径、最小生成树、并查集等经典算法。下面将对这些知识点进行详细阐述。 1. **线段树**:线段树是一种数据结构,用于高效地...
[NOI2005]维护数列 [POI2007]ZAP-Queries [HAOI2008] 糖果传递 [HAOI2008]圆上的整点.cpp [HNOI2008]GT考试 [HNOI2008]遥远的行星 [JSOI2008]星球大战 [SDOI2008]洞穴勘测 [ZJOI2008]瞭望塔 [ZJOI2008]骑士 [ZJOI...
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 数据...
交通重复荷载下软土层固结,循环荷载下较大的软土变形