洛谷P2456 二进制方程
字符串模拟+并查集
建立两个并查集分别存放每个变量的每一位数的祖先,一个是1一个是2
考虑每个字母的每一位的数都是唯一的,先模拟,记录每一个变量的每一位。
一一映射到方程中去,最后将两个方程进行一一比较,然后合并并查集。中间判断是否出现一位既是1又是2的情况
最后统计自由元的个数cnt,高精求解2^cnt
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
#define N 100100
using namespace std;
int k, tot, len, len1, len2, tot1, tot2;
int x[N], y[N], sum[N], fa[N], jin[N]; //sum[i]表示i所代表的字母的开始位置
string s1, s2;
int find(int a)
{
if (a == fa[a]) return a;
return fa[a] = find(fa[a]);
}
signed main()
{
scanf("%lld", &k);
sum[1] = len = 2;
for (int i = 2; i <= k + 1; i++)
scanf("%lld", &len), sum[i] = sum[i - 1] + len, tot += len;
cin >> s1 >> s2;
int len1 = s1.size(), len2 = s2.size();
for (int i = 0; i < len1; i++)
{
if (s1[i] >= 'a' && s1[i] <= 'z')
{
int now = s1[i] - 'a' + 1;
for (int j = sum[now]; j < sum[now + 1]; j++)
x[++tot1] = j;
}
else x[++tot1] = s1[i] - '0';
}
for (int i = 0; i < len2; i++)
{
if (s2[i] >= 'a' && s2[i] <= 'z')
{
int now = s2[i] - 'a' + 1;
for (int j = sum[now]; j < sum[now + 1]; j++)
y[++tot2] = j;
}
else y[++tot2] = s2[i] - '0';
}
if (tot1 != tot2)
printf("0"), exit(0);
for (int i = 1; i <= tot1 * 4; i++)
fa[i] = i;
for (int i = 1; i <= tot1; i++)
{
int a = x[i], b = y[i];
if (a + b == 1) //如果a,b不相等,就直接输出不行
printf("%lld\n", 0), exit(0);
int da = find(a), db = find(b);
if (da + db == 1)
printf("0"), exit(0);
if (da != db) //已经排除了a,b等于1或0的情况
fa[da] = db, tot--;
}
int big[100010]= {1}, top=1;
for(int i=tot; i>=1; i--)
{
for(int i=0; i<top; ++i)big[i]<<=1;
for(int i=0; i<top; ++i)if(big[i]>=10)
{
big[i+1]+=big[i]/10,big[i]%=10;
}
for(; big[top]; ++top)
{
big[top+1]+=big[top]/10,big[top]%=10;
}
}
for(int i=top-1; i>=0; --i) printf("%lld", big[i]);
return 0;
}
/*
5
4 2 4 4 2
1bad1
acbe
*/
洛谷P2456 二进制方程的更多相关文章
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- p2456二进制方程 题解
题面描述:可以跳过 一个形如: X1X2…Xn=Y1Y2..Ym 的等式称为二进制方程. 在二进制方程的两边:Xi和Yj (1<=i<=n:1<=j<=m)是二进制数字(0.1 ...
- [NOIP2014] 提高组 洛谷P2312 解方程
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
- 洛谷P4428二进制 [BJOI2018] 线段树
正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...
- 洛谷 P2312 解方程 解题报告
P2312 解方程 题目描述 已知多项式方程: \(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) 均为正整 ...
- 洛谷P1633 二进制
P1633 二进制 题目描述 有三个整数A.B.C,以下用N(2)表示N的二进制(没有前导0). 设A(2).B(2).C(2)的最大长度为L,你需要构造三个正整数X.Y.Z,满足以下条件: (1) ...
- 洛谷 P2312 解方程
题目 首先,可以确定的是这题的做法就是暴力枚举x,然后去计算方程左边与右边是否相等. 但是noip的D2T3怎么会真的这么简单呢?卡常卡的真是熟练 你需要一些优化方法. 首先可以用秦九韶公式优化一下方 ...
- 洛谷 P2104 二进制
P2104 二进制 题目描述 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运算 1:将整个二进制数加 1 运算 2:将整个二进制数减 1 ...
- 洛谷 P2312 解方程 题解
P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解(\(n\) 和 \(m\) 均为 ...
随机推荐
- Unity3D 跨平台原理
Unity3D的跨平台原理核心在于对指令集CIL(通用中间语言)的应用. 机理 首先需要知道,Unity中的Mono是基于 通用语言架构(Common Language Infrastructure, ...
- backpropagation algorithm
搞卷积神经网络的时候突然发现自己不清楚神经网络怎么训练了,满脸黑线,借此机会复习一下把. 首先放一位知乎大佬的解释.https://www.zhihu.com/question/27239198?rf ...
- Net文件递归查找并保存
原理:遍历当前文件夹的子文件,保存遍历文件夹下的所有文件 主要方法(2个): //获取文件夹下的所有文件 并保存 string[] path = Directory.GetFiles(NeedFile ...
- 【洛谷 P4137】 Rmq Problem / mex(主席树)
题目链接 容易发现,可能答案只有\(0\).每个数,每个数\(+1\) 于是把这\(2n+1\)个数建立一个权值线段树,可持久化一下,每个节点记录这个子树中最后加入数加入的时间的最小值\(latest ...
- pc,h5端动态设置style
<p class="plan" :style="'width:' + unit"></p>
- Java中map接口 遍历map
转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ...
- vue + elementui 使用多选按钮实现单选功能
CommonRadio.vue <template> <div> <el-checkbox-group v-model="checkList" @ch ...
- vue routes路由
mode: 'history',去掉浏览器上url前的#号
- VSCode - Beautify插件配置
注: 本文摘自 黑火巨雷 - 简书 1. 在工作目录下建立.jsbeautifyrc文件 官方文档 { "brace_style": "none,preserve-inl ...
- p3.BTC-协议
数字货币是文件,难伪造,但是容易复制,不像实体货币,花出去就没了,数字货币存在double spending attack,双花攻击. 去中心化的货币,需要解决两个问题: 1.货币的发行 挖矿 2.交 ...