1138 代码等式[附加题]

该题有题解

时间限制:500MS  内存限制:65536K
提交次数:59 通过次数:21

题型: 编程题   语言: G++;GCC

Description

一个代码等式就是形如x1x2...xi=y1y2...yj,这里xi和yj是二进制的数字(0或1)或者是一个变量(如英语中的小写字母)。
每一个变量都是一个有固定长度的二进制代码。例如:
a,b,c,d,e是变且它们的长度分别是4,2,4,4,2。考虑等式:1bad1=acbe,这个等式共有16组解。现要求任给一个等式,计算一共有多少组解。
(变量最多26个,长度和不超过10000)

输入格式

第一行数N为变量个数;
第二行N个数,为每个变量的位数
第三行为一个等式

输出格式

输出解的个数,无解输出0

输入样例

5
4 2 4 4 2
1bad1=acbe

输出样例

16

题解:

可知每个字母变量分为相应长度的01变量,假设这种单位长度的01变量为单位变量。

总思路:将值必须是一样的单位变量放进同一个集合。(在等式的牵连下,某些单位变量的值要对应变化)

具体做法:

1.为每个单位变量分配一个空间(从2开始),存放其所属集合(由于等式中有0和1作为常量,所以也要为0和1分配空间,看其所属集合)。

2.首先是判断等式两边长度是否相等,若相等,则继续。

3.通过并查集,逐步为每个单位变量找到所属的集合,(期间如果发现常量1和常量0被要求在同一个集合,则不可能实现,直接退出)

4.遍历每一个单位变量(从0开始),统计集合数sum,则 ans = pow(2,sum-2) 减去2是因为常量0和常量1所在的集合的值已经确定了。

注意:代码等式可能只出现01的其中一个或不出现,那又减去2是否合法呢?不是应该出现几种常量才减去几吗? 其实在遍历单位变量找集合时,从0开始,已经假设两个变量都出现了,再减去它,不管有没有真的出现,都不影响答案。类似的好像叫做虚拟变量。

学习之处:将变量放到格子当中,通过下标与变量形成映射。

代码如下:

 #include<cstdio>//scau 1138 代码等式
#include<cstring>
#include<cstdlib>
#include<cmath> int fa[],length[],beg[]; int find(int x)
{
return (x==fa[x]?x:find(fa[x]));
} void Union(int m, int n)//这里可以优化,将深度大的合并到深度低的,这样查找速度会加快。用迭代。
{
m = find(m);
n = find(n);
if(m!=n)
fa[m] = n;
} int main()
{
int n, s1[],s2[],len1 = ,len2 = ;
scanf("%d",&n);
scanf("%d",&length[]);
beg[] = ;
for(int i = ; i<n; i++)//为每个字母变量分配相应长度的单位变量,与此同时,每个单位变量都与数组的下标形成了一一对应的关系
{
scanf("%d",&length[i]);
beg[i] = beg[i-] + length[i-];
} char ch;
getchar();
while((ch= getchar())!='=')//处理等式,将其转换成以单位变量为形式的串,并将串存到数组中,等待并查集
{
if(ch=='' || ch=='')
s1[len1++] = ch-''; else
{
for(int i = ; i<length[ch-'a']; i++)
s1[len1++] = beg[ch-'a'] + i;
}
} while((ch= getchar())!='\n')
{
if(ch=='' || ch=='')
s2[len2++] = ch-''; else
{
for(int i = ; i<length[ch-'a']; i++)
s2[len2++] = beg[ch-'a'] + i;
}
} if(len1!=len2)
{
printf("0\n");
return ;
} for(int i = ; i<beg[n-]+length[n-]; i++) //初始化每个单位变量的集合为自己
fa[i] = i; for(int i = ; i<len1; i++)//并查集
{
if(s1[i]+s2[i]==)
{
printf("0\n");
return ;
} Union(s1[i],s2[i]);
} int ans = ;
for(int i = ; i<beg[n-]+length[n-]; i++)//遍历每个单位变量,统计集合个数
if(fa[i]==i) ans++; printf("%.0lf\n",pow(,ans-));
return ;
}

SCAU 1138 代码等式 并查集的更多相关文章

  1. SCAU 1138 代码等式

    1138 代码等式 时间限制:500MS  内存限制:65536K提交次数:59 通过次数:21 题型: 编程题   语言: 无限制 Description 一个代码等式就是形如x1x2...xi=y ...

  2. 小米oj 不要乱改代码(并查集)

     不要乱改代码 序号:#91难度:非常难时间限制:2000ms内存限制:50M 描述 最近小米公司内爆发了一种名叫"瞎改我代码就会死"的传染病. 传播方式是只要与染病者共同编辑过一 ...

  3. *HDU2473 并查集

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. UVa 10129 (并查集 + 欧拉路径) Play on Words

    题意: 有n个由小写字母的单词,要求判断是否存在某种排列使得相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列 ...

  5. 【OI】Kruskal & ufs (克鲁斯卡与并查集)

    Kruskal是有关于最小生成树的算法. 这个算法非常好理解,用一句话来概括就是: 从小到大找不同集合的边. 那么,具体是怎样的呢. 1.先把所有顶点初始化为一个连通分量. 2.从所有边中选择最小的( ...

  6. 并查集(不相交集合)详解与java实现

    目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 @(文章目录) 认识并查集 ...

  7. nyoj 42-一笔画问题 (欧拉图 && 并查集)

    42-一笔画问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:10 submit:25 题目描述: zyc从小就比较喜欢玩一些小游戏,其中就包括画 ...

  8. 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)

    传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...

  9. 编程算法 - 食物链 并查集 代码(C)

    食物链 并查集 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有N仅仅动物, 分别编号为1,2,...,N. 全部动物都属于A,B,C中的一种 ...

随机推荐

  1. 可能是全网最详细的express--middleware

    写在前面 hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力. GitHub仓库地址 ...

  2. 洛谷—— P2117 小Z的矩阵

    https://www.luogu.org/problemnew/show/2117 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1 ...

  3. Centos7源码安装MySQL5.7

    a.连接数据库报111 从一台linux远程连接另一台linux上的MySQL,出现ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx. ...

  4. HtmlEmail实现简单发送邮件

    一般发送邮件的话系统项目中可能会用到,像一些通知信息自动发送等,会用到发送邮件的情况,发送邮件有好多种,包括设置各种格式,添加图片附件等,当然今天我们先看一下怎么实现发送成功. 工欲善其事必先利其器, ...

  5. 深入理解Thread构造函数

    上一篇快速认识线程 本文参考汪文君著:Java高并发编程详解. 1.线程的命名 在构造现成的时候可以为线程起一个名字.但是我们如果不给线程起名字,那线程会有一个怎样的命名呢? 这里我们看一下Threa ...

  6. chrome mac 快捷键

    ⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Google Chrome 浏览器中打开计算机中的文件. 按住 ⌘ 键,然后 ...

  7. Cesium 显示CZML数据

    转自文章 Cesium随笔(5)CZML介绍(介个文章是转的嘿嘿) 通过czml可以在cesium上实现非常棒的动态效果   CZML的结构   CZML是一种用来描述动态场景的JSON架构的语言,主 ...

  8. 【windows】windows下的hosts文件位置

  9. iOS -- SKPhysicsJointSpring类

    SKPhysicsJointSpring类 继承自 NSObject 符合 NSCoding(SKPhysicsJoint)NSObject(NSObject) 框架  /System/Library ...

  10. sublime快捷键设置

    1.sublime自带的快捷键设置:这里的super在mac下是指command键 右边的内容表示用户自定义的快捷键:比如如图所示command+d表示复制光标所在行 常用操作:复制粘贴什么的太常用的 ...