NKOJ 2106 机密谍报 (并查集)
来源:互联网 发布:mac apktool使用教程 编辑:程序博客网 时间:2024/05/17 07:52
P2106 机密谍报
问题描述
HY 非常喜欢和 GJQ 闲聊,而其他人等都还奋斗在 OI 的道路上,为了不打扰同学,他们交流统一用密文,交流信息的明文是由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种可能的明文)
样例输入
100ad1
cc1
4
a 2
d 3
c 4
b 50
样例输出
2
提示
明文的长度 ≤ 10000,保证不用高精度
此题其实很水,用并查集将相同的位置合并起来,然后再把值为0的位置合并到一个集合里,值为1的位置合并到一个集合里,然后既不在0集合里也不在1集合里的集合数就是不能确定的位置数,答案就是
但是注意判无解,如果最后0集合和1集合在一个集合里,即表示某位置既是0又是1,则无解。
代码:
#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#define N 55555#define ll unsigned long longusing namespace std;const ll T=40000;string s1,s2;vector<ll>P[233];char A[233];ll n,L[233],sum1[N],sum2[N],F[N];bool mark[N];ll GF(ll x){ if(F[x]!=x)F[x]=GF(F[x]); return F[x];}void Merge(ll x,ll y){ ll fx=GF(x),fy=GF(y); if(fx!=fy)F[fx]=fy;}ll QM(ll a,ll b){ ll ans=1; while(b) { if(b&1)ans=ans*a; b>>=1;a=a*a; } return ans;}int main(){ ll i,j,k,ans;ans=0; cin>>s1>>s2; s1=" "+s1;s2=" "+s2; scanf("%lld",&n); for(i=1;i<=n;i++)scanf("\n%c %lld",&A[i],&k),L[A[i]]=k; for(i=1;i<=T;i++)F[i]=i; for(i=1;i<s1.length();i++) if(s1[i]=='0')sum1[i]=sum1[i-1]+1,Merge(sum1[i],T); else if(s1[i]=='1')sum1[i]=sum1[i-1]+1,Merge(sum1[i],T+1); else sum1[i]=sum1[i-1]+L[s1[i]],P[s1[i]].push_back(sum1[i-1]); for(i=1;i<s2.length();i++) if(s2[i]=='0')sum2[i]=sum2[i-1]+1,Merge(sum2[i],T); else if(s2[i]=='1')sum2[i]=sum2[i-1]+1,Merge(sum2[i],T+1); else sum2[i]=sum2[i-1]+L[s2[i]],P[s2[i]].push_back(sum2[i-1]); for(i=1;i<=n;i++) for(j=1;j<=L[A[i]];j++) for(k=1;k<P[A[i]].size();k++)Merge(P[A[i]][k-1]+j,P[A[i]][k]+j); for(i=1;i<=sum1[s1.length()-1];i++)if(GF(i)!=GF(T)&&GF(i)!=GF(T+1)&&(!mark[GF(i)]))ans++,mark[GF(i)]=1; if(GF(T)!=GF(T+1))printf("%lld",QM(2,ans)); else printf("0");}
阅读全文
0 0
- NKOJ 2106 机密谍报 (并查集)
- NKOJ 2107 可爱的猴子(并查集)
- NKOJ 3762 守夜人 (并查集)
- 【题】【并查集(带权)】NKOJ 3770 财务信息
- 【例题】【并查集(带权)&题干有诈】NKOJ 3764 树上间距
- 【趣题&输入略坑】【并查集(带权)】NKOJ 3762 守夜人
- 并查集(集并查)
- 并查集(含关系并查集)
- 【并查集】食物链(关系并查集)
- 【并查集】并查集详解(转)
- 分组并查集(种类并查集)
- 并查集, 畅通工程(简单并查集)
- [数据结构]并查集水体POJ2236(并查集)
- 并查集(disjoint_set)
- 并查集(模板)
- 并查集(亲戚)
- POJ2524(并查集)
- POJ_2236(并查集)
- 【WebLogic使用】WebLogic的下载与安装
- EditText密码输入错误后重新获取焦点并自动弹出软键盘
- ueventd.rc 处理硬件设备权限和android init 对其解析
- 安卓E/CursorWindow: Failed to read row 0, column 0 from a CursorWindow which has 0 rows, 5 columns解决方案
- java小项目(文件读取)标准化考试
- NKOJ 2106 机密谍报 (并查集)
- redis简介
- 广义表
- 小白java笔记——UML介绍
- 2014-03-28-JDK环境变量配置
- 【esp8266】MCU下arduino uno添加LED开关代码示例
- js通过正表达式获取链接参数id
- populating-next-right-pointers-in-each-node(i,ii)
- ubuntu 16.04 LTS