p2456二进制方程 题解
题面描述:可以跳过
一个形如:
X1X2…Xn=Y1Y2..Ym
的等式称为二进制方程。
在二进制方程的两边:Xi和Yj (1<=i<=n;1<=j<=m)是二进制数字(0、1)或者一个变量(小写字母)。每个变量都是一个有固定长度的二进制代码,他可以在等式中取代变量的位置,称这个长度为变量的长度。为了解一个二进制方程,需要给其中的变量赋予适当的二进制代码,使得我们用他们替代等式中的相应的变量后(等式的两边都变成二进制代码),这个等式成立。
编程任务:
对于每一个给出的方程,计算一共有多少组解。已知变量最多有26个(26个英文小写字母),且等式的每一端的数字和变量的长度之和不超过10000。
输入格式
第一行:k(k<=26,变量的个数,规定使用小写英文字母中的前k个字母作为变量,如k=5,则变量a,b,c,d,e)。
第二行:k个正整数,中间用一个空格隔开,依次代表k个变量的长度。
第三行:等式左边的表达式。
第四行:等式右边的表达式。
输出格式
等式中出现的变量共有多少组解。
输入输出样例
2
4 2
1b1
a
4
5
4 2 4 4 2
1bad1
acbe
16
说明/提示
样例一:4组解
1 、a=1001; b=00
2、 a=1011; b=01
3、 a=1101; b=10
4、 a=1111; b=11)
样例二:K=5,变量:a,b,c,d,e。长度分别为:4 2 4 4 2。等式是:1bad1= acbe
输出16,即变量a,b,c,d,e共有16组解。
(为什么复制按钮还能粘贴上??(雾))
正解开始:
首先读懂题意我们知道,每一个字母都代表一个式子,且把每一个字母替换成数字后可以使得左右两个式子相等。
本人思路来源:先进行过样例式的枚举:
考虑这种情况:假如左边式子第1位是a,右边式子第一位是1,一个数字,一个字母,因为题意要满足对应位相等,所以我们可以确定字母a的第一位为1。但是,因为整个字符串中maybe有多个a,那么我们找到字符串中的其他的a,把它们第一位对应的位数赋值为1.
然而a的第一位的对应位确定,那么等号另一边的对应位也能确定了,而它又是一个字母,于是我们把这个字母的对应位也找出来进行赋值。。。。。。这么下去,解法逐渐明朗:并查集。
具体来说,我们可以按照这种方法,把所有的能遍历到的位置按照并查集处理,并看做一种情况。最后,看还剩几种情况,我们把答案高精度乘为2的几次方就OK了(因为每一位有0,1两种方法)qwq。
code:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=; int n,m,k,sum;
int num[maxn],fa[maxn],x[maxn],y[maxn]; inline int find(int x)
{
if(x==fa[x])return x;
fa[x]=find(fa[x]);
return fa[x];
} int main() {
num[]=;
scanf("%d",&k);
for(int i=,x;i<=k+;++i)
{
scanf("%d",&x);
num[i]=num[i-]+x;
sum+=x;//记录总不同的个数
}
char zfc[maxn];
scanf("%s",zfc);
for(int i=;zfc[i];++i)
{
if(zfc[i]>='a'&&zfc[i]<='z')
{
int c=zfc[i]-'a'+;//获取他是num数组第几个
for(int j=num[c];j<num[c+];++j)x[++n]=j;//按位置赋值
}
else x[++n]=zfc[i]-'';//数字的话
}
scanf("%s",zfc);
for(int i=;zfc[i];++i)
{
if(zfc[i]>='a'&&zfc[i]<='z')
{
int c=zfc[i]-'a'+;
for(int j=num[c];j<num[c+];++j)y[++m]=j;//字母
} else y[++m]=zfc[i]-'';//数字
}
if(n!=m)//连左右长度都不相等
{
printf("");return ;//直接输出零
}
for(int i=;i<maxn;++i)fa[i]=i;//初始化并查集找父亲
for(int i=;i<=n;++i)
{
int dx=find(x[i]),dy=find(y[i]);
if(dx+dy==)
{
printf("");
return ;
}
if(dx!=dy)
{
fa[max(dx,dy)]=min(dx,dy);
sum--;
}
}
int big[maxn]={},top=;
for(int i=sum;i>=;i--)
{
for(int i=;i<top;++i)big[i]<<=;
for(int i=;i<top;++i)if(big[i]>=) {
big[i+]+=big[i]/,big[i]%=;
}
for(;big[top];++top) {
big[top+]+=big[top]/,big[top]%=;
}
}
for(int i=top-;i>=;--i) printf("%d",big[i]);
return ;
}
完结qwq
p2456二进制方程 题解的更多相关文章
- 洛谷P2456 二进制方程
题目 字符串模拟+并查集 建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2 考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位. 一一映射到方程中去,最后将两个方程进行 ...
- Luogu p2456 二进制方程
这是一道我也不知道我gu了多久的题目 (然鹅还有n多任务没有完成) 反正--我太难了 好了言归正传,题目链接 是一道校内测的题目(现在应该没有人没考了吧?) 思路的话,是神仙并查集√ 觉得虽然并查集很 ...
- P2456 [SDOI2006]二进制方程
P2456 [SDOI2006]二进制方程 题解 拿个样例模拟一下发现 把等式两边对应展开,每个位置的填数都是一一对应的 比如第二个样例 分类讨论: (1)xi yi 都是数字,但是不相同,此时无 ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷 P2312 解方程 题解
P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解(\(n\) 和 \(m\) 均为 ...
- [SDOI2006] 二进制方程
并查集水题.维护变量的对应位的相关关系,判断不确定点(自由元)的个数即可. 代码中的p数组:p[1] 值的id, p[2~k+1]每个变量的第一位的id. #include <bits/stdc ...
- 洛谷P2312解方程题解
题目 暴力能得\(30\),正解需要其他的算法操作,算法操作就是用秦九韶算法来优化. 秦九韶算法就是求多项式的值时,首先计算最内层括号内一次多项式的值,然后由内向外逐层计算一次多项式的值,然后就将求\ ...
- 2019.11.11&12题解
Day1 考的不是很好,T1T2没区分度,T3想的太少,考试后期几乎都是在摸鱼,bitset乱搞也不敢打,只拿到了35分,跟前面的差距很大 A. 最大或 标签: 二进制+贪心 题解: 首先x,y中一定 ...
- 【USACO 3.2】Stringsobits (dp)
题意:求第k大的最多有l个1的n位二进制. 题解:dp[i][j]表示长度为i最多有j个1的二进制有多少种,则有: 状态转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-1],即第i位 ...
随机推荐
- layui select 联动渲染赋值不了数据的问题
今天用 layui做select的时候,数据老是看不到,而且联动的数据是对不上的,看了网上一堆是 最后要用 form.render('select'); 这个是必须的, 但是我用了还是这样,其实是la ...
- Angular中ngx-image-cropper图片裁剪的使用
GitHub示例源码地址:https://github.com/luoruiemail/ngx-image-cropper 下载下来之后,执行yarn install安装相关node_modules包 ...
- 手写Indexof
String.prototype.indexO = function(st){ // console.log(this.length); let str = this; var j = 0; let ...
- 深入理解MySQL索引原理和实现——为什么索引可以加速查询?
说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某 ...
- Android开发自定义View
Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...
- Thinkphp5 自定义上传文件名
这几天在做tp5的上传文件模块,项目需求是要把文件名在上传之后修改为 用户名+原文件名的组合形式,在网上找了一会儿发现好像没有类似的文章...只好自己去研究研究了. 之前查看过看云上面的官方手册,文件 ...
- T100——接口代码记录,jsonArray和json
{<section id="cs_t1client.description" >} #應用 a00 樣板自動產生(Version:) #+ Version..: T10 ...
- 26-Perl 包和模块
1.Perl 包和模块Perl 中每个包有一个单独的符号表,定义语法为:package mypack;此语句定义一个名为 mypack 的包,在此后定义的所有变量和子程序的名字都存贮在该包关联的符号表 ...
- 【原创】大叔经验分享(72)mysql时区
查看当前时区 > show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value ...
- 数据库SQL优化分析查询语句总结
方法一: SELECT TOP 10 TEXT AS 'SQL Statement' ,last_execution_time AS 'Last Execution Time' ,(total_log ...