P2456 [SDOI2006]二进制方程

题解

拿个样例模拟一下发现

把等式两边对应展开,每个位置的填数都是一一对应的

比如第二个样例

分类讨论:

(1)xi  yi  都是数字,但是不相同,此时无解

(2)xi  yi  都是数字,相同,唯一填法

(3)xi  yi  一个是数字,一个是字母,唯一填法

(4)xi  yi  都是字母,颜色不同,那么一旦在该颜色对应的位置上填了一个数字,对应的另一种颜色,或者是该颜色在其他区域的对应位置也填上了这个数字

所以我们就把同一种颜色的方块用并查集联系起来

解释代码:

(1)num[ ] 给0,1,每一个字母每一个位置都有唯一的编号,num[ i ]记录第 i 种字母的最后一个位置在哪里,但是实际应用起来就是下表对应的亚子:

这么做是方便以后的并查集

(2)sum记录多少个待确定的位置(也就是有两种填法),答案其实是 2待确定位置数

(3)x[ ] y[ ] 记录展开后的式子

(4)判断无解,1是x[  ] y[  ]长度不一样,2是 xi  yi 的祖先一个是1 一个是0

(5)取最大的一个的父亲是最小的一个

(6)高精度

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int num[],x[],y[],fa[],sum=,t1=,t2=,k;
char s[];
int c[],lenc; int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
} void cheng()
{
c[]*=;
for(int i=;i<lenc;i++)
{
c[i]=c[i]*+c[i-]/;
c[i-]%=;
}
while(c[lenc-]>=)
{
c[lenc]=c[lenc-]/;
c[lenc-]%=;
lenc++;
}
} int main()
{
k=read();
num[]=; //解释1
for(int i=,u;i<=k+;i++)
{
u=read();
num[i]=num[i-]+u;
sum+=u; //解释2
}
scanf("%s",s);
int len=strlen(s);
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
int v=s[i]-'a'+;
for(int j=num[v];j<num[v+];j++) x[++t1]=j;
}
else x[++t1]=s[i]-'';
}
scanf("%s",s);
len=strlen(s);
for(int i=;i<len;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
int v=s[i]-'a'+;
for(int j=num[v];j<num[v+];j++) y[++t2]=j;
}
else y[++t2]=s[i]-'';
} if(t1!=t2){ printf("0\n");return ; } //无解判断 for(int i=;i<=num[k+];i++) fa[i]=i; for(int i=;i<=t1;i++)
{
int f1=find(x[i]),f2=find(y[i]);
if(f1+f2==) { printf("0\n");return ; } //解释4
if(f1!=f2)
{
fa[max(f1,f2)]=min(f1,f2); //解释5
sum--; //少了一个可以填两种方案的
}
} c[]=;lenc=;
for(int i=sum;i>=;i--)
cheng(); //解释6
for(int i=lenc-;i>=;i--)
printf("%d",c[i]); return ;
}

P2456 [SDOI2006]二进制方程的更多相关文章

  1. [SDOI2006] 二进制方程

    并查集水题.维护变量的对应位的相关关系,判断不确定点(自由元)的个数即可. 代码中的p数组:p[1] 值的id, p[2~k+1]每个变量的第一位的id. #include <bits/stdc ...

  2. p2456二进制方程 题解

    题面描述:可以跳过 一个形如: X1X2…Xn=Y1Y2..Ym 的等式称为二进制方程. 在二进制方程的两边:Xi和Yj (1<=i<=n:1<=j<=m)是二进制数字(0.1 ...

  3. 洛谷P2456 二进制方程

    题目 字符串模拟+并查集 建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2 考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位. 一一映射到方程中去,最后将两个方程进行 ...

  4. Luogu p2456 二进制方程

    这是一道我也不知道我gu了多久的题目 (然鹅还有n多任务没有完成) 反正--我太难了 好了言归正传,题目链接 是一道校内测的题目(现在应该没有人没考了吧?) 思路的话,是神仙并查集√ 觉得虽然并查集很 ...

  5. BZOJ 3107 二进制a+b

    Description 输入三个整数\(a, b, c\),把它们写成无前导\(0\)的二进制整数.比如\(a=7, b=6, c=9\),写成二进制为\(a=111, b=110, c=1001\) ...

  6. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  7. UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举

    题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...

  8. 背包问题(01背包,完全背包,多重背包(朴素算法&&二进制优化))

    写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下  01背包 大家先看一下这道01背包的问题  题目  有m件物品和一个容量为 ...

  9. P4574 [CQOI2013]二进制A+B

    传送门 思路: 本题可用数位DP来做,设 f [ i ][ a ][ b ][ c ][ j ] 表示当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位. ...

随机推荐

  1. Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别

    Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...

  2. mysql 获取表字段说明SQL

    SELECTTABLE_NAME as '表名', column_name AS '列名', data_type AS '数据类型', character_maximum_length AS '字符长 ...

  3. 把app(apk和ipa文件)安装包放在服务器上供用户下方法

    怎么把app(apk和ipa文件)安装包放在服务器上供用户下载? IIS服务器网站不能下载.apk文件的原因:IIS的默认MIME类型中没有.apk文件,所以无法下载.解决办法:给.apk格式文件添加 ...

  4. 【Git】五、远程仓库

    前面4节将的都是本地的git操作,这节开始讲合并到本地分支后,如何与远程仓库做交互 -------------------------------- 提要 //生成本地ssh密钥 $ ssh-keyg ...

  5. (备忘)Java Map 遍历

    //最常规的一种遍历方法,最常规就是最常用的,虽然不复杂,但很重要,这是我们最熟悉的,就不多说了!! public static void work(Map<String, Student> ...

  6. win10家庭版设置移动热点出现“我们无法设置移动热点”

    寝室wifi卡到爆炸,  买了一个360随身WiFi,可是360随身WiFi烧坏了  ...然后我就一个星期没玩游戏了 今天本来想开电脑的wifi试一试,结果发现无法设置热点 纳闷了 百度一下,发现都 ...

  7. java8 常用语法小结

    // 判空 // 排序 //映射 //序列化

  8. Python项目列表

    70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5. ...

  9. mybatis分页未明确的列定义

    问题出现原因是 集成mybaits时 会自动加上 select tmp_page.*, rownum row_id from ( abc )tmp_page 我的问题是 abc区域的列名有重名的,保持 ...

  10. SpringBoot项目中使用Bootstrap 的CSS、JS资源

    首先 需要在 application.properties 文件中添加这句 spring.mvc.static-path-pattern=/** 不然是使用不了的 还有一种办法就是 使用bootstr ...