[SDOI2006] 二进制方程
并查集水题。维护变量的对应位的相关关系,判断不确定点(自由元)的个数即可。
代码中的p数组:p[1] 值的id, p[2~k+1]每个变量的第一位的id。
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+7;
int n,m,k,tot;
int p[N],fa[N],x[N],y[N];
int get(int x) {return fa[x]==x? x: fa[x]=get(fa[x]);}
int main() {
	p[1]=2;
	scanf("%d",&k);
	for(int i=2,x; i<=k+1; ++i) {
		scanf("%d",&x);
		p[i]=p[i-1]+x;
		tot+=x;
	}
	static char str[N];
	scanf("%s",str);
	for(int i=0; str[i]; ++i) {
		if(isalpha(str[i])) {
			int c=str[i]-'a'+1;
			for(int j=p[c]; j<p[c+1]; ++j) x[++n]=j;
		} else x[++n]=str[i]-'0';
	}
	scanf("%s",str);
	for(int i=0; str[i]; ++i) {
		if(isalpha(str[i])) {
			int c=str[i]-'a'+1;
			for(int j=p[c]; j<p[c+1]; ++j) y[++m]=j;
		} else y[++m]=str[i]-'0';
	}
	if(n!=m) {
		puts("0");
		return 0;
	}
	for(int i=1; i<N; ++i) fa[i]=i;
	for(int i=1; i<=n; ++i) {
		int dx=get(x[i]), dy=get(y[i]);
		if(dx+dy==1) {
			puts("0");
			return 0;
		}
		if(dx!=dy) {
			fa[max(dx,dy)]=min(dx,dy);
			tot--;
		}
	}
	static int dig[N]={1},top=1;
	while(tot--) {
		for(int i=0; i<top; ++i) dig[i]<<=1;
		for(int i=0; i<top; ++i) if(dig[i]>=10) {
			dig[i+1]+=dig[i]/10, dig[i]%=10;
		}
		for(; dig[top]; ++top) {
			dig[top+1]+=dig[top]/10, dig[top]%=10;
		}
	}
	for(int i=top-1; ~i; --i) printf("%d",dig[i]);
	return 0;
}
以下为输入格式:
第一行:k(k<=26,变量的个数,规定使用小写英文字母中的前k个字母作为变量,如k=5,则变量a,b,c,d,e)。
第二行:k个正整数,中间用一个空格隔开,依次代表k个变量的长度。
第三行:等式左边的表达式。
第四行:等式右边的表达式。
[SDOI2006] 二进制方程的更多相关文章
- P2456 [SDOI2006]二进制方程
		
P2456 [SDOI2006]二进制方程 题解 拿个样例模拟一下发现 把等式两边对应展开,每个位置的填数都是一一对应的 比如第二个样例 分类讨论: (1)xi yi 都是数字,但是不相同,此时无 ...
 - p2456二进制方程 题解
		
题面描述:可以跳过 一个形如: X1X2…Xn=Y1Y2..Ym 的等式称为二进制方程. 在二进制方程的两边:Xi和Yj (1<=i<=n:1<=j<=m)是二进制数字(0.1 ...
 - 洛谷P2456 二进制方程
		
题目 字符串模拟+并查集 建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2 考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位. 一一映射到方程中去,最后将两个方程进行 ...
 - Luogu p2456 二进制方程
		
这是一道我也不知道我gu了多久的题目 (然鹅还有n多任务没有完成) 反正--我太难了 好了言归正传,题目链接 是一道校内测的题目(现在应该没有人没考了吧?) 思路的话,是神仙并查集√ 觉得虽然并查集很 ...
 - BZOJ 3107 二进制a+b
		
Description 输入三个整数\(a, b, c\),把它们写成无前导\(0\)的二进制整数.比如\(a=7, b=6, c=9\),写成二进制为\(a=111, b=110, c=1001\) ...
 - 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
		
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
 - UVA11825 黑客的攻击 Hackers' Crackdown  状压DP,二进制,子集枚举
		
题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...
 - 背包问题(01背包,完全背包,多重背包(朴素算法&&二进制优化))
		
写在前面:我是一只蒟蒻~~~ 今天我们要讲讲动态规划中~~最最最最最~~~~简单~~的背包问题 1. 首先,我们先介绍一下 01背包 大家先看一下这道01背包的问题 题目 有m件物品和一个容量为 ...
 - P4574 [CQOI2013]二进制A+B
		
传送门 思路: 本题可用数位DP来做,设 f [ i ][ a ][ b ][ c ][ j ] 表示当前枚举到(二进制下的)第i位,a' b' c'各用a,b,c了几个1,j表示最后一位是否有进位. ...
 
随机推荐
- JavaScript资源网址
			
JavaScript 全栈工程师培训教程 http://www.ruanyifeng.com/blog/2016/11/javascript.html
 - C/S和B/S架构
			
1.C/S架构(Client/Server结构,熟知的客户机和服务器结构),它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统 ...
 - Django的rest_framework的视图之基于ModelViewSet视图源码解析
			
前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...
 - 【转载】我为什么弃用OpenStack转向VMware vsphere
			
我为什么弃用OpenStack转向VMware Vsphere,一切皆为简单.高效.因为我们在工作过程中涉及到大量的测试工作,每天都有成百个虚拟机的创建和销毁工作. 工作任务非常繁重,我们的持续集成平 ...
 - JS脚本-零星片段
			
1.这种写法:(function(){})(),同时注意:原生的异步对象的兼容性实例化方法 <script> document.domain = "qq.com"; x ...
 - 在IIS7里配置 ISAPI,运行dll程序,总提示下载dll
			
在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为“true"即可.
 - Linux anaconda 内网 安装 卸载
			
安装并不难, 官网介绍的很清楚, 但每次到官网找安装方法不方便,我总结了本文(很全) 官网下载Linux版anaconda, 地址https://www.anaconda.com/download/# ...
 - js控制style样式
			
1.行内样式获取打印出来 2.内嵌和外链的获取不了 <div style="width:200px;height:200px; background: red;">&l ...
 - 一句话shell【php】
			
1.mysql执行语句拿shell Create TABLE a (cmd text NOT NULL); Insert INTO a (cmd) VALUES('<?php @eval($_P ...
 - Linux 第八天
			
4.源码包和rpm包的区别 1)区别 安装前:概念上的区别 安装后:安装位置不同 2)安装位置 rpm包安装位置 Rpm包默认安装路径 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安 ...