搜索问题的关键:优秀的搜索策略以及行之有效的减枝

对于这道题我们阶乘搜肯定不行所以我们按位搜,我们对每一位的三个数进行赋值,然后判解。

对于此一类的搜索乘上一个几十的常数来减枝往往要比直接搜要快得多,因为这样的问题他们都会有一个庞大的"之后",而且判断不存在较为容易,以我们多花一些时间进行减枝往往能达到剪掉许多枝的效果。

搜索还是看感觉,倒搜还是比正搜快......

#pragma GCC optimize("O3")
#include <cstdio>
#include <cstring>
char A[],B[],C[];
int a[],b[],c[],n;
int qian[],hou[],ans[],get[];
bool god;
inline void put_it(){
int len=n;
for(int i=len-;i>=;i--)
a[len-i]=A[i]-'A';
len=strlen(B);
for(int i=len-;i>=;i--)
b[len-i]=B[i]-'A';
len=strlen(C);
for(int i=len-;i>=;i--)
c[len-i]=C[i]-'A';
for(int i=;i<=n;i++)hou[i]=i+,qian[i+]=i;
memset(get,-,sizeof(get)),memset(ans,-,sizeof(ans));
}
inline void dfs(int now,int up){
if(now==n+){
if(!up){
god=;
for(int i=;i<n;i++)printf("%d ",ans[i]);
}
return;
}
if(god)return;
register int temp;
if(ans[a[now]]!=-&&ans[b[now]]!=-){
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
return;
}
if(ans[a[now]]==-&&ans[b[now]]==-){
if(a[now]==b[now]){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
for(int j=qian[n+];j>;j=qian[j]){
if(get[j-]!=-)continue;
hou[qian[j]]=hou[j],qian[hou[j]]=qian[j],get[j-]=;
ans[b[now]]=j-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[b[now]]=-;
hou[qian[j]]=j,qian[hou[j]]=j,get[j-]=-;
}
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
if(ans[b[now]]!=-){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
if(ans[a[now]]!=-){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[b[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[b[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
}
int main(){
scanf("%d%s%s%s",&n,A,B,C),put_it(),dfs(,);
return ;
}

最新文章

  1. 苹果IOS系统SVN命令 同样适用于linux系统
  2. hadoop2——新MapReduces——yarm详解
  3. 归并排序java
  4. 简述UITextField的属性和用法
  5. PL/SQL Developer ORA-12154: TNS: 无法解析指定的连接标识符
  6. HDU 1074 Doing Homework(像缩进DP)
  7. Spring AspectJ的Execution表达式-备忘笔记
  8. java学习笔记 --- 异常
  9. final的用法
  10. JLINK(SEGGER)灯不亮 USB不识别固件修复、clone修改
  11. [poj3349]Snowflake Snow Snowflakes_hash
  12. Get Docker CE for CentOS
  13. 文件下载中使用inputStream流获取文件大小
  14. c# API接受图片文件以文件格式上传图片
  15. oracle学习笔记1(环境搭建)
  16. Freemarker操作字符串
  17. Code Chef TSUM2(动态凸包+点分治)
  18. SpringBoot入门篇--对于JSON数据的返回以及处理二
  19. CSS3 object-fit 图像裁剪
  20. Linux环境Nginx安装、调试以及PHP安装

热门文章

  1. PHP-提升PHP性能的几个扩展
  2. 《linux设备驱动开发详解》笔记——15 linux i2c驱动
  3. LEAVE TO LIST-PROCESSING
  4. Sqoop的安装配置及使用
  5. FPGA数字鉴相鉴频器的开发记录
  6. web开发微信文章目录
  7. CDateTimeUI类源码分析
  8. 「日常训练」「小专题·USACO」 Barn Repair(1-4)
  9. Django学习笔记(一):环境安装与简单实例
  10. CCF-NOIP-2018 提高组(复赛) 模拟试题(四)