最多只有一个连通块大小大于$nk$,所以用hash表进行BFS的时候只扩展$nk$步即可。

时间复杂度$O(n^2k)$。

#include<cstdio>
typedef long long ll;
const int N=5001000,M=9999991;
int n,m,lim,i,h=1,t,g[M],nxt[N],ed;ll v[N],a[N/5],q[N],x,S,T;char s[70];
inline void del(ll x){
int u=x%M;
v[ed]=x;nxt[ed]=g[u];g[u]=ed++;
}
inline void add(ll x){
int u=x%M;
for(int i=g[u];i;i=nxt[i])if(v[i]==x)return;
v[ed]=x;nxt[ed]=g[u];g[u]=ed++;q[++t]=x;
}
inline ll read(){
ll t=0;
scanf("%s",s);
for(int i=0;i<n;i++)t=t*2+s[i]-'0';
return t;
}
int main(){
scanf("%d%d",&n,&m);lim=n*m+5;
add(S=read());T=read();
for(i=0;i<m;i++)del(a[i]=read());
while(h<=t&&t<=lim){
x=q[h++];
if(x==T)return puts("TAK"),0;
for(i=0;i<n;i++)add(x^(1LL<<i));
}
if(t<=lim)return puts("NIE"),0;
for(h=1,t=ed=i=0;i<M;i++)g[i]=0;
add(T);
for(i=0;i<m;i++)del(a[i]);
while(h<=t&&t<=lim){
x=q[h++];
if(x==S)return puts("TAK"),0;
for(i=0;i<n;i++)add(x^(1LL<<i));
}
return puts(t<=lim?"NIE":"TAK"),0;
}

  

最新文章

  1. react+redux教程(一)connect、applyMiddleware、thunk、webpackHotMiddleware
  2. Monkey Android API 翻译
  3. 网络热恋之SDWebImage
  4. [转] 在Linux平台使用mhVTL虚拟化磁带库
  5. SourceTree不出现用户登录窗口,提示错误fatal: unable to access&#39;...&#39;; error setting certificate verify locations
  6. hdu 1228 A+B 字符串处理 超级大水题
  7. nginx反向代理的简单配置
  8. Objective-C中的Block(闭包) (轉載)
  9. 粵語/廣東話/Cantonese 資料/Material
  10. ping不通的几种可能原因
  11. jsonarray和jsonobject
  12. vdi、vhd、vmdk虚拟格式转换
  13. 设计模式(Design Patterns)Java版
  14. ANOVA-方差分析和单尾方差分析
  15. mysql 原理 ~ 死锁问题
  16. DevSecOps 运维模式中的安全性
  17. TCP三次握手--syn攻击
  18. SQLyog简介及其功能(附百度云盘下载地址)
  19. @pathvariable和@RequestParam的区别
  20. 原生和web交互jsbridge交互总结

热门文章

  1. poj1733(种类并查集+离散化)
  2. Installing MySQL Server on CentOS
  3. 为什么没有选择sipml5
  4. myeclipse报错: java compiler level does not match the version of the installed java project facet
  5. 深入理解计算机中的 csapp.h和csapp.c
  6. C专家编程cdecl
  7. C语言中如何将二维数组作为函数的参数传递
  8. BurpSuite导出log配合SQLMAP批量扫描注入点
  9. loadrunner生成随机数
  10. Liferay 6.2 改造系列之十二:修改Portal设置页面表单内容