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升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比 ...
随机推荐
- Android 多线程断点下载
package com.itheima.mutiledownloader; import java.io.BufferedReader; import java.io.File; import jav ...
- Android Intent个人介绍
在Android中要打开一个新的Activity, 不用说,肯定会用到Intent,Intent作为Android的四大组件之一,个人理解,Intent的作用就是用来在(其它三个不同组件)间进行通讯, ...
- gcc编译代码报错及编译方式
一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错, ...
- chrome控制台小技巧
对于大多数开发人员来说,chrome控制台最常用的命令就是 console.log()了,然后还有一些其他类似的命令,如: console.info() 提示信息 console.error() ...
- bzoj1562
很明显是二分图匹配,关键是怎么求字典序最小 想到两种做法,首先是直接匹配,然后从第一位贪心调整 第二种是从最后一个倒着匹配,每次匹配都尽量选小的,这样一定能保证字典序最小 type node=reco ...
- UVa 11722 (概率 数形结合) Joining with Friend
高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x.y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w 从图形上看就是矩形夹在两条平行 ...
- Jqgrid入门-显示基本的表格(一)
首先对Jqgrid网格插件做个简要的说明.在众多的表格插件中,Jqgrid的特点是非常鲜明的. 特点如下: 完整的表格呈现与运算功能,包含换页.栏位排序.grouping.新增.修改及 ...
- temp - Linux administration handbook 答案
我开始做第一章后的练习题,发觉不是很容易随意地回答,就像是C++ primer之后的练习题的感觉. 自己有这么多不会的,让我感觉很不爽啊- -! 先不要要求自己一下子都明了,一口吃不成胖子,先找一份工 ...
- wave文件(*.wav)格式、PCM数据格式
1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采 ...
- MySQL基础之第10章 查询数据
10.1.基本查询语句 SELECT 属性列表 FROM 表名和视图列表[WHERE条件表达式1][GROUPBY 属性名1 [HAVING条件表达式2]][ORDERBY 属性名2[ASC|DESC ...