solution:

这一题是比较难实现的双向搜索题:(字符串+双向搜索+hash记忆化)

我们可以先把K的前半部分枚举出来,并将得出的所有结果和题目给的n个数的每一个数的前半部分都比对一遍,得到它和每一个数有几位相同,并hash存到map中去。

然后我们枚举K的后半部分,并将得出的所有结果和题目给的n个数的每一个数的后半部分都比对一遍,得到它和每一个数有几位相同。这样我们可以得到:对于每一个枚举出的结果,他所对应的前半部分和n个数中每个数比对后应该有几位相同,将你得到的结果与标准值取差然后hash,看map中是否有一样的值存在。(存在就表示你找到了一个(也可能是多个)解,然后判断一下输出即可)

当然,这一题还难在细节,要仔细一点(前导零,字符串的处理,如何hash,怎样比对,分类讨论应该输出什么........)

=>

code:

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int using namespace std; int n,m,s,su,ans,f;
int l[11],r[55];
int b[55],a[55][11];
char ch[55]; map<int,int> h; inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
} inline int haxi(){
unsigned int sdf=11;
for(rg i=1;i<=n;++i){
sdf=(sdf+b[i])*7+13;
}
return sdf%inf;
} inline int bint(int i,int j){
int res=0;
for(;i<=j;++i)
res=res*10+l[i];
return res;
} inline void yu(int t){
if(t>m){
for(rg i=1;i<=n;++i){ b[i]=0;
for(rg j=1;j<=m;++j)
b[i]+=(a[i][j]==l[j]?1:0);
if(b[i]>r[i])return ;
}
int sdf=haxi(),lkj=bint(1,m);
if(h.find(sdf)!=h.end()) h[sdf]=-1;
else h[sdf]=lkj;
return ;
}
for(rg i=0;i<=9;++i)
l[t]=i, yu(t+1);
} inline void dfs(int t){
if(t>s){
for(rg i=1;i<=n;++i){ b[i]=0;
for(rg j=m+1;j<=s;++j)
b[i]+=(a[i][j]==l[j]);
if(b[i]>r[i])return ;
b[i]=r[i]-b[i];
}
int sdf=haxi();
if(h.find(sdf)!=h.end()){
if((su=h[sdf])<0||ans)
puts("Ambiguity"),exit(0);
else{
int lkj=bint(m+1,s);
for(rg i=m+1;i<=s;++i)su*=10;
ans=su+lkj;
}
}
return ;
}
for(rg i=0;i<=9;++i)
l[t]=i,dfs(t+1);
} int main(){
//freopen("passwd.in","r",stdin);
//freopen("passwd.out","w",stdout);
n=qr(); s=qr(); m=s/2;
for(rg i=1;i<=n;++i){
cin>>ch;r[i]=qr();
for(rg j=1;j<=s;++j)
a[i][j]=ch[j-1]-'0';
} yu(1); dfs(m+1);
if(ans){ int su=ans;
for(rg i=1;i<=s;++i){
if(!su)printf("0");
su/=10;
}printf("%d",ans);
}
else puts("Liar");
return 0;
}

TC-572-D1L2 (双向搜索+记忆化)的更多相关文章

  1. Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索

    最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...

  2. *HDU1142 最短路+记忆化dfs

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  3. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  4. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  5. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)

    题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...

  7. hdu 4826(dp + 记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...

  8. zoj 3644(dp + 记忆化搜索)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...

  9. loj 1044(dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...

随机推荐

  1. 华为笔试——C++字符串四则运算的实现

    题目:字符串四则运算的实现 有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值.四则运算即:加减乘除"+-*/",另外该表达式中的数字只能是1位(数值范围0~9),运算 ...

  2. Redis学习01_redis安装部署(centos)

    原文: http://www.cnblogs.com/herblog/p/9305668.html Redis学习(一):CentOS下redis安装和部署 1.基础知识  redis是用C语言开发的 ...

  3. Linux内核分析——第四周学习笔记20135308

    第四周 扒开系统调用的“三层皮” 一.内核.用户态和中断 (一)如何区分用户态.内核态 1.一般现在的CPU有几种不同的指令执行级别 ①在高级别的状态下,代码可以执行特权指令,访问任意的物理地址,这种 ...

  4. JavaScript编码命名规范及格式规范

    变量 局部变量命名采用首字母小写,其它单词首字母大写: //推荐 var printContent = 'hello world' //不推荐,变量名意义不明确 var objext = {}; // ...

  5. 更新pip10后 ImportError: cannot import name ‘main'

    百度了几个回答都没有解决问题,有些回答明显是直接复制过来的一点价值都没有,然后google一下立马解决.很多时候不能怪搜索引擎,问题出在一些国内网友对知识的不负责任 解决:找到报错文件,也就是那个pi ...

  6. shell 命令 if [ -d filename] 判断文件

    作者:曹毅涵  [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊 ...

  7. mac 关闭显示器 & 快捷键

    mac 关闭显示器 & 快捷键 https://support.apple.com/zh-cn/HT201236 https://support.apple.com/zh-cn/HT20705 ...

  8. Spring之AOP注解配置

    1.导入相应jar包 2.引入约束并配置XML文件 <beans xmlns="http://www.springframework.org/schema/beans" xm ...

  9. 使用AutoMapper实现Dto和Model的自由转换(下)

    书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...

  10. 【大数据】Zookeeper学习笔记

    第1章 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括:统 ...