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位 ...
随机推荐
- sql内联注入
测试字符串 变 种 预 期 结 果 ' 触发错误.如果成功,数据库将返回一个错误 1' or '1'='1 1') or ('1'='1 永真条件.如果成功,将返回表中所有的行 value' o ...
- 【VS开发】C语言遍历文件夹
// StdCFIndAllFiles.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...
- Cookie中的httponly的属性和作用
1.什么是HttpOnly? 如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样就增加了cookie的安 ...
- springcloud 心得记录
1.nacos,模块启动无加载顺序 2.nacos,线上配置中心修改文件后,需重启模块
- jinfo 命令
NAME jinfo - Generates configuration information. SYNOPSIS jinfo [ option ] pid 示例:jinfo 3245
- Highest Frequency Letters
Given a list of strings, output the most frequent characters that are in the same group as the lette ...
- 强大的strace命令用法详解
文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和 ...
- delphicbuilder10_2_1 安装破解注册
安装程序 1.解压delphicbuilder10_2_1.iso,以管理员身份运行..\delphicbuilder10_2_1\Install\Setup.exe——选择安装语言——点击OK(推荐 ...
- sqlserver bcp命令导出数据
原文:sqlserver bcp命令导出数据 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net ...
- Linux就该这么学——新手必须掌握的命令之常用的系统工作命令
echo命令 含义:echo命令用于在终端输出字符串或变量提取后的值,格式为 : echo [字符串|$变量] 示例: 将”Linuxprobe.com”输出到终端屏幕的命令为: [root@linu ...