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. otool随笔测试

    otool 工具 查看库/反编译等二进制信息 1 依赖库查询 otool -L Payload/XXX.app/XXX 2 查看该应用是否砸壳 otool -l Payload/XXX.app/XXX ...

  2. Java秒杀实战 (七)安全优化

    转自:https://blog.csdn.net/qq_41305266/article/details/81174782 一.隐藏秒杀地址 思路:秒杀开始前,先去请求接口获取秒杀地址 1.接口改造, ...

  3. 第二章、前端之css

    目录 第二章.前端之css 一.css介绍 二.css语法 三.css几种引入方式 四.css选择器 五.css属性相关 六.css盒子模型 第二章.前端之css 一.css介绍 css(Cascad ...

  4. 【Day3】项目实战。百度针对Xpath的反爬策略和解决方式

    import lxml.etree as le with open('edu.html','r',encoding='utf-8') as f: html = f.read() html_x = le ...

  5. Airflow安装错误:sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError)

    1 完整的异常信息: raise errorclass, errorvalue sqlalchemy.exc.OperationalError: (_mysql_exceptions.Operatio ...

  6. input子系统驱动

    input子系统驱动 框架分析 核心层 文件为:/drivers/input/input.c: 首先找到入口函数为**static int __init input_init(void)**,在该函数 ...

  7. idou老师带教你学Istio 03: istio故障注入功能的介绍和使用

    故障注入测试 故障注入测试顾名思义就是当被测试应用部分组件或功能出现潜在故障时其本身的容错机制是否正常工作,以达到规避故障保证正常组件或功能的使用.Istio提供了HTTP故障注入功能,在http请求 ...

  8. Collection 和 Collections 有什么区别?(未完成)

    Collection 和 Collections 有什么区别?(未完成)

  9. SQL Server 元数据分类

    SQL Server 中维护了一组表用于存储 SQL Server 中所有的对象.数据类型.约束条件.配置选项.可用资源等信息,这些信息称为元数据信息(Metadata),而这些表称为系统基础表(Sy ...

  10. HTML5新特性——1 HTML5音频

    注意:<source>同一个音乐可以添加不同格式的音频,这样就可以满足不同浏览器都能够正常播放,兼容不同浏览器. 代码示例: <!doctype html> <html ...