题目

字符串模拟+并查集

建立两个并查集分别存放每个变量的每一位数的祖先,一个是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 二进制方程的更多相关文章

  1. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  2. p2456二进制方程 题解

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

  3. [NOIP2014] 提高组 洛谷P2312 解方程

    题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...

  4. 洛谷P4428二进制 [BJOI2018] 线段树

    正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...

  5. 洛谷 P2312 解方程 解题报告

    P2312 解方程 题目描述 已知多项式方程: \(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) 均为正整 ...

  6. 洛谷P1633 二进制

    P1633 二进制 题目描述 有三个整数A.B.C,以下用N(2)表示N的二进制(没有前导0). 设A(2).B(2).C(2)的最大长度为L,你需要构造三个正整数X.Y.Z,满足以下条件: (1) ...

  7. 洛谷 P2312 解方程

    题目 首先,可以确定的是这题的做法就是暴力枚举x,然后去计算方程左边与右边是否相等. 但是noip的D2T3怎么会真的这么简单呢?卡常卡的真是熟练 你需要一些优化方法. 首先可以用秦九韶公式优化一下方 ...

  8. 洛谷 P2104 二进制

    P2104 二进制 题目描述 小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算: 运算 1:将整个二进制数加 1 运算 2:将整个二进制数减 1 ...

  9. 洛谷 P2312 解方程 题解

    P2312 解方程 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 [1,m][1,m] 内的整数解(\(n\) 和 \(m\) 均为 ...

随机推荐

  1. 在 centos 上安装 virutalbox

    目录 简介 centos 6.x 安装 virtual box Step 1 – Add Required Yum Repositories Step 2 – Install Required Pac ...

  2. OO第三单元(地铁,JML)单元总结

    OO第三单元(地铁,JML)单元总结 这是我们OO课程的第二个单元,这个单元的主要目的是让我们熟悉并了解JML来是我们具有规格化编程架构的思想.这个单元的主题一开始并不明了,从第一次作业的路径到第二次 ...

  3. JavaScript 自己写一个 replaceAll() 函数

    JavaScript 的  replace()  方法可以在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 但是,只输入字符串的话,仅替换第一个字符,当然也可以用正则表达式来进行 ...

  4. stage1----航空票务系统需求分析报告

    航空票务管理系统需求分析报告 题    目    航空票务管理系统需求分析报告 学    院       信息科学与工程学院 专    业        计算机科学与技术 组    员         ...

  5. 代替for-in 遍历对象

    object.keys() object.getOwnPropertyName()

  6. 一文看懂Java Worker 设计模式

    Worker模式 想解决的问题 异步执行一些任务,有返回或无返回结果 使用动机 有些时候想执行一些异步任务,如异步网络通信.daemon任务,但又不想去管理这任务的生命周.这个时候可以使用Worker ...

  7. MySql时区修改

    1.查看当前时间 > select curtime(); #或select now()也可以+-----------+| curtime() |+-----------+| 15:18:10 | ...

  8. ORA-01031:insufficient privileges 解决方法

    使用sys或system帐号登录plSql时,提示ORA-01031:insufficient privileges 错误.使用其他的帐号能正常登录,在cmd命令中用system帐号也是可以正常登录. ...

  9. C++(三十六) — 等号操作符重载、&&,||不可重载

    1.等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1 ...

  10. 在linux上安装python

    转自:https://www.cnblogs.com/qq631243523/p/10191726.html 一,前言 centos7默认是装有python的,咱们先看一下 [root@glh ~ 2 ...