BZOJ2570: [NOI2000]算符破译

【题目描述】
考古学发现,几千年前古梅文明时期的数学非常的发达,他们懂得多位数的加法和乘法,其表达式和运算规则等都与现在通常所用的方式完全相同(如整数是十进制,左边是高位,最高位不能为零;表达式为中缀运算,先乘后加等),唯一的区别是其符号的写法与现在不同。有充分的证据表明,古梅文明的数学文字一共有13个符号,与 0,1,2,3,4,5,6,7,8,9,+,*,= 这13个数字和符号(称为现代算符)一一对应。为了便于标记,我们用13个小写英文字母a,b,…m代替这些符号(称为古梅算符)。但是,还没有人知道这些古梅算符和现代算符之间的具体对应关系。
在一个石壁上,考古学家发现了一组用古梅算符表示的等式,根据推断,每行有且仅有一个等号,等号左右两边为运算表达式(只含有数字和符号),并且等号两边的计算结果相等。
假设这组等式是成立的,请编程序破译古梅算符和现代算符之间的对应关系。

【输入格式】
输入文件的第一行为等式的个数N(1<=N<=1000),以下N行每行为一个等式。
每个等式的长度为5个字符到11个字符。

【输出格式】
如果不存在对应关系能够满足这组等式,输出“noway”和一个换行/回车符。
如果有对应关系能够满足这组等式,输出所有能够确定的古梅算符和现代算符的对应关系。每一行有两个字符,其中第一个字符是古梅算符,第二个字符是对应的现代算符。输出按照字典顺序排序。

【样例输入】
2
abcdec
cdefe

【样例输出】
a6
b*
d=
f+

【样例说明】
在上例中,可能对应的现代表达式为{6*2=12,2=1+1},{6*4=24,4=2+2},{6*8=48,8=4+4}。可见,能够确定的对应关系只有a对应6,b对应*,d对应=,f对应+,应该输出;而{c,e}虽然能够找到对应的现代算符使得等式成立,但没有唯一的对应关系,不能输出。其他古梅算符{g,h…m}完全不能确定,也不能输出。

【分析】
相比消棋子我觉得还是这道题酸爽一点……毕竟不是单纯的模拟还要敲搜索疯狂的剪枝…………总之我讨厌写搜索,最让人痛恨的是调试搜索TAT
没有充足心里准备不要敲这道题= =

反正终归是水过了嘛……下面来讲讲怎么做的。
首先,裸的搜索要敲对吧(PS:爆搜连样例都过不去调试毛线啊……)
这里无视Std各种各样的优化(标程一共敲了600行)

然后编写是有一点要注意我们可以优先确定三个操作符的对应关系(体现在代码中的三个for循环,这样搜索就只需要搜数字)

第一个优化:搜索时位运算压位,方便编写,加快速度,这个看代码应该都能理解。
第二个优化:其实算不上优化,就是我开始比较蠢……没写位运算,然后就是说把判断放到了搜索完之后……显而易见 O(N!) 连样例都过不了。
第三个优化:确定了运算符之后我们就可以大致确定出等号两边的数的位数,也就是大概的范围,这样可以直接跳过大量不可能的情况。最重要的优化。(对应代码中的Pre_Dfs)

/**************************************************************
    Problem: 2570
    User: Array98
    Language: C++
    Result: Accepted
    Time:136 ms
    Memory:1060 kb
****************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int INF=int(1e9);
const int MaxN=1010;
int T;
char a[MaxN][15]; 
int len[MaxN],lg2[(1<<10)+10];
int w[15],Ans[15],st[15],cnt[15][MaxN];
bool c1[15],c2[15],mark[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值