SCAU 1138 代码等式
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 代码等式的更多相关文章
- SCAU 1138 代码等式 并查集
1138 代码等式[附加题] 该题有题解 时间限制:500MS 内存限制:65536K 提交次数:59 通过次数:21 题型: 编程题 语言: G++;GCC Description 一个代码等 ...
- 编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议47~51)
建议47:在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题,这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JavaBe ...
- NOIP200806 火柴棒等式【B005】
[B005]火柴棒等式[难度B]———————————————————————————————————————————————————————————— [题目要求] 给你n根火柴棍,你可以拼出多少个 ...
- 建模分析之机器学习算法(附python&R代码)
0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...
- 天气预报API(二):全球城市、景点代码列表(“旧编码”)
说明 2016-12-10 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页...还发现城市编码有两种,暂且称中国天气网这些编码为旧标准"旧编码"的特征是 9个字符长度; ...
- 【bzoj2118】 墨墨的等式
http://www.lydsy.com/JudgeOnline/problem.php?id=2118 (题目链接) 题意 给出${B}$的取值范围${[Bmin,Bmax]}$,求方程${a_{1 ...
- 一个 11 行 Python 代码实现的神经网络
一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...
- 数论+spfa算法 bzoj 2118 墨墨的等式
2118: 墨墨的等式 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1283 Solved: 496 Description 墨墨突然对等式很感兴 ...
- Java开发中程序和代码性能优化
现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...
随机推荐
- 使用Maven创建一个Spring MVC Web 项目
使用Maven创建java web 项目(Spring MVC)用到如下工具: 1.Maven 3.2 2.IntelliJ IDEA 13 3.JDK 1.7 4.Spring 4.1.1 rele ...
- sql server 读取表结构
SELECT 表名 then d.name else '' end, 字段序号=a.colorder, 主键 FROM sysobjects where xtype='PK' and name in ...
- Storm集群的搭建
storm的环境和hadoop的环境没有任何关系 1.安装Zookeeper集群 2.解压storm 3.修改文件conf/storm.yaml 3.1.配置zookeeper服务器 storm.zo ...
- NDK(19)简单示例:ndk调用java基本方法、数组;使用stl、访问设备
一.ndk调用java类示例 1,调用基本方法 /* * Class: com_example_ndksample_MainActivity * Method: ndkFindJavaClass * ...
- Android开发之事件分发和Listener
参考:http://blog.csdn.net/zhongkejingwang/article/details/38141719 http://blog.csdn.net/zhongkejingwan ...
- [51NOD]BSG白山极客挑战赛
比赛链接:http://www.51nod.com/contest/problemList.html#!contestId=21 /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ min ...
- Unique Encryption Keys (思维题 预处理)
题目 题意:给m个数字, q次询问, 询问b到e之间如果有重复数字就输出, 没有就输出OK 思路:用f[i]数组 记录从i开始向后最近的有重复数字的 位置, 如 1 3 2 2, 则f[1] = 4; ...
- 获取Android 手机屏幕宽度和高度以及获取Android手机序列号
1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...
- iOS开发:Swift多线程NSOperation的使用
介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...
- ASP.NET在IE10,IE11中Form表单身份验证失效问题解决方法
已经研究出解决方案. 在web.config中的forms中增加cookieless="UseCookies"属性即可. <authentication mode=&qu ...