1138 代码等式

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

题型: 编程题   语言: 无限制

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

解题思路

题目意思:

代码由二进制数0,1和小写字母组成,其中字母代表若干个01二进制数,现在题目给你一个等式,等式也是有01和字母组成,然后告诉你用到字母的长度(二进制数的个数)根据等式判断满足等式的情况有多种

解题步骤:

个人的愚见一开始是用数组代表左右式子,根据字母的长度和已知的0和1分配到数组里,给每个数组里的元素记录信息,信息包括:所属的字母、在这个元素在字母中的排位,是否已经确认。前面两个信息是为了在接下来匹配等式两边的数时查找时要用到。而第三个信息点是为了在匹配当中和最后判断情况的时候用到确认这个元素是否是待定的。

开始时是以一个式子(默认为左式)为主式,从左到右扫,先根据已给的二进制扫,判断它的相同位置在副式(默认右式)中属于哪一个字母的那个位置,然后根据此查看牵动了多少其他元素的变动,变动主要分在这两个式子,所以我是分开判断,在此基础上,又开始在主和副式从左扫到右,根据情况再次变动,一直根据位置的变动判断元素的变动。最终停止的情况是找不到有相同所属字母和在字母中的排位(也就是一开始要存储得到前两点信息)

判断情况的时候是在上面的基础上进行的。也是手动将其中的元素变成已知。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAXN 10010
typedef struct equation{
int value, row, column;// value指是否已确认该值,row指所属的字母,column指排在的位置
}equation;
equation left[MAXN], right[MAXN];
char input[MAXN];
int num[], m; int Transform(int cur, int kind)
{//根据kind的值仅是判断当前改变的在左式还是右式子
int i, j, flag;
if(kind == && right[cur].value == )
{
for(i=; i<m; i++)
{
if(right[i].row == right[cur].row && right[i].column == right[cur].column && right[i].value == )
{
right[i].value = ;
Transform(i, );
}
if(left[i].row == right[cur].row && left[i].column == right[cur].column && left[i].value == )
{
Transform(i, );
}
}
}
else if(kind == && left[cur].value == )
{//下面的两个if可以当做两个for使用,一个元素的改变牵动左右两条式子,这里要做的就是及时更新信息
for(i=; i<m; ++i)
{
if(left[i].row == left[cur].row && left[i].column == left[cur].column && left[i].value == )
{
left[i].value = ;
Transform(i, );
}
if(right[i].row == left[cur].row && right[i].column == left[cur].column && right[i].value == )
{
Transform(i, );
}
}
}
return ;
} int Before(int cur)
{
int i;
for(i=; i<m; i++)
{
if(right[i].row == right[cur].row && right[i].column == right[cur].column && right[i].value == )
{
right[i].value = ;
Transform(i, );
}
if(left[i].row == right[cur].row && left[i].column == right[cur].column && left[i].value == )
{
Transform(i, );
}
}
} int main()
{
// freopen("input.txt", "r", stdin);
int i, j, n, len, flag, buffer, str_left, str_right, cur_num, ans = , k;
scanf("%d", &n);
for(i=; i<n; ++i)
scanf("%d", &num[i]);
scanf("%s", input);
len = strlen(input);
flag = strchr(input, '=') - input;
k = m = str_left = str_right = ;
for(i=; i<flag; ++i)
{
if(input[i] != '' && input[i] != '')
{
buffer = input[i] - 'a';
m += num[buffer];
for(j=; j<num[buffer]; ++j,++str_left)
{
left[str_left].value = ;
left[str_left].row = buffer;
left[str_left].column = j;
}
}
else
{
left[str_left].value = ;
left[str_left].row = left[str_left].column = -;
str_left++;
m++;
}
}
//前后的两个for循环都是初始化信息
for(i=flag+; i<len; ++i)
{
if(input[i] != '' && input[i] != '')
{
buffer = input[i] - 'a';
k += num[buffer];
for(j=; j<num[buffer]; ++j, ++str_right)
{
right[str_right].value = ;
right[str_right].row = buffer;
right[str_right].column = j;
}
}
else
{
left[str_right].value = ;
left[str_right].row = right[str_right].column = -;
str_right++;
k++;
}
}
if(k != m)
{//左右两式子的个数都不相同则表示无解
printf("0\n");
return ;
}
for(i=; i<m; ++i)
{
if(left[i].row == left[i].column && left[i].row == -)
Transform(i, );
if(right[i].row == right[i].column && right[i].row == -)
Transform(i, );
}
for(i=; i<m; ++i)
{//计算情况,before函数的作用就是为了模拟之前改动元素的情况,代码是直接复制的
if(left[i].value == )
{
ans *= ;
Before(i);
}
}
for(i=; i<m; ++i)
{
if(left[i].value != right[i].value)
{
printf("0\n");
return ;
}
}
printf("%d\n", ans);
return ;
}
												

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

  1. SCAU 1138 代码等式 并查集

    1138 代码等式[附加题] 该题有题解 时间限制:500MS  内存限制:65536K 提交次数:59 通过次数:21 题型: 编程题   语言: G++;GCC Description 一个代码等 ...

  2. 编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)

    建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBe ...

  3. NOIP200806 火柴棒等式【B005】

    [B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...

  4. 建模分析之机器学习算法(附python&R代码)

    0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...

  5. 天气预报API(二):全球城市、景点代码列表(“旧编码”)

    说明 2016-12-10 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页...还发现城市编码有两种,暂且称中国天气网这些编码为旧标准"旧编码"的特征是 9个字符长度; ...

  6. 【bzoj2118】 墨墨的等式

    http://www.lydsy.com/JudgeOnline/problem.php?id=2118 (题目链接) 题意 给出${B}$的取值范围${[Bmin,Bmax]}$,求方程${a_{1 ...

  7. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

  8. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  9. Java开发中程序和代码性能优化

    现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...

随机推荐

  1. mac root用户初始密码设置

    具体方法如下: 1)sudo su切换到root,输入的用户密码是当前用户的密码: 2)切换到root后,执行passwd root,设置root用户密码即可.

  2. 在Hadoop伪分布式模式下安装Hive(derby,mysql)

    我的Hadoop版本是1.2.0,mysql版本是5.6.12. 先介绍一下嵌入式derby模式: 1.下载/解压 在hive官网上选择要下载的版本,我选择的版本是hive-0.10.0. 下载好解压 ...

  3. Github欢乐多 PHP神级代码引发吐槽热

    前日,github的PHP板块惊现一段能够提升70%运行效率的代码,引发了全世界众多网友的吐槽和调侃,“awesome!”.“well done!”.“PHP是世界第一语言!”平时不苟言笑,埋头苦干的 ...

  4. C#实现Comparable接口实现排序

    C#中,实现排序的方法有两种,即实现Comparable或Comparer接口,下面简单介绍实现Comparable接口实现排序功能. 实现Comparable接口需要实现CompareTo(obje ...

  5. linux sort命令学习

    linux sort命令以行为单位对文本文件进行排序. 接下来我们会以/tmp/sort_test.txt这个文本文件为例对sort命令的用法进行说明. sh-# cat /tmp/sort_test ...

  6. Struts2的简单案例

    第一步:首先下载struts2的架包(链接地址:http://download.csdn.net/detail/ahy1024/4626028) 第二步:新建web project项目 DemoStr ...

  7. gulp browser-sync自动刷新插件

    很久没弄gulp了,都快忘了,今天又来温习下browser-sync 自动刷新插件,在安装的时候出现以下提示: $ npm install browser-sync --save-dev> ws ...

  8. RAPIDXML 中文手册,根据官方文档完整翻译!

    简介:这个号称是最快的DOM模型XML分析器,在使用它之前我都是用TinyXML的,因为它小巧和容易上手,但真正在项目中使用时才发现如果分析一个比较大的XML时TinyXML还是表现一般,所以我们决定 ...

  9. 【Todo】JS跨域访问问题的解决

    做双十一,需要在主会场页面,嵌入我们产品的JS豆腐块.而这个豆腐块需要调用我们后端的数据接口,涉及跨域访问. 参考 http://www.cnblogs.com/2050/p/3191744.html ...

  10. poj 3792 Area of Polycubes (简单模拟)

    题目 题意:在三维坐标系中,给定n个立方体的中心坐标,立方体的边长为1,按照输入顺序,后来输入的必须和之前输入的立方体有公共的边. 而且,不能和之前输入的立方体相同. 如果满足条件,输出表面积.如果不 ...